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>

_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to