[Haskell] Re: putStr is not evaluated in the correct order
Clifford Beshers
clifford.beshers at linspire.com
Mon Sep 4 15:27:49 EDT 2006
Simon Marlow wrote:
>
> We could consider adding a message along the lines you suggest... any
> other ideas?
>
I remember running into this. I wasn't confused by the expected
behavior, it was the fact that ghci had different behavior than compiled
programs and that the settings seem to be wrong at startup. I tracked
down this bug at the time and forgot to report it.
ghci starts with NoBuffering behavior, even though the mode appears to
be LineBuffering. Setting it once fixes the problem.
I've included a ghci session that demonstrates the bug by showing the
change in behavior when pressing Control-D in response to each call to
getLine. The results are identical for 6.4.1 and 6.6 rc1.
___ ___ _
/ _ \ /\ /\/ __(_)
/ /_\// /_/ / / | | GHC Interactive, version 6.4.1, for Haskell 98.
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
\____/\/ /_/\____/|_| Type :? for help.
Loading package base-1.0 ... linking ... done.
Prelude> :m +System.IO
Prelude System.IO> hGetBuffering stdin >>= print
LineBuffering
Prelude System.IO> getLine >>= print
^D
"\EOT"
Prelude System.IO> hSetBuffering stdin NoBuffering >> hGetBuffering
stdin >>= print
NoBuffering
Prelude System.IO> getLine >>= print
^D
"\EOT"
Prelude System.IO> hSetBuffering stdin LineBuffering >> hGetBuffering
stdin >>= print
LineBuffering
Prelude System.IO> getLine >>= print
*** Exception: <stdin>: hGetLine: end of file
Prelude System.IO>
___ ___ _
/ _ \ /\ /\/ __(_)
/ /_\// /_/ / / | | GHC Interactive, version 6.5.20060831, for
Haskell 98.
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
\____/\/ /_/\____/|_| Type :? for help.
Loading package base ... linking ... done.
Prelude> :m +System.IO
Prelude System.IO> hGetBuffering stdin >>= print
LineBuffering
Prelude System.IO> getLine >>= print
^D
"\EOT"
Prelude System.IO> hSetBuffering stdin NoBuffering >> hGetBuffering
stdin >>= print
NoBuffering
Prelude System.IO> getLine >>= print
^D
"\EOT"
Prelude System.IO> hSetBuffering stdin LineBuffering >> hGetBuffering
stdin >>= print
LineBuffering
Prelude System.IO> getLine >>= print
*** Exception: <stdin>: hGetLine: end of file
Prelude System.IO>
More information about the Haskell
mailing list