On Tue, 2009-10-27 at 17:00 +0100, Daniel Fischer wrote:

> Look at the sources:
> 
> hGetLine :: Handle -> IO ByteString
> hGetLine h = wantReadableHandle "Data.ByteString.hGetLine" h $ \ handle_ -> do
>     case haBufferMode handle_ of
>        NoBuffering -> error "no buffering"
>        _other      -> hGetLineBuffered handle_
> 
>  where
>   ...
> 
> So, in ghci, stdin isn't buffered and ByteString can't cope with that.
> Why exactly, I don't know.

By comparison if we look at System.IO.hGetLine we see:

hGetLine :: Handle -> IO String
hGetLine h = do
  m <- wantReadableHandle "hGetLine" h $ \ handle_ -> do
        case haBufferMode handle_ of
           NoBuffering      -> return Nothing
           LineBuffering    -> do
              l <- hGetLineBuffered handle_
              return (Just l)
           BlockBuffering _ -> do 
              l <- hGetLineBuffered handle_
              return (Just l)
  case m of
        Nothing -> hGetLineUnBuffered h
        Just l  -> return l

So there is something special about an unbuffered hGetLine. I can't
remember exactly but when we implemented hGetLine for ByteString I guess
we didn't understand / couldn't be bothered with the weird unbuffered
case.

The System.IO code in ghc-6.10 also notes:

-- ToDo: the unbuffered case is wrong: it doesn't lock the handle for
-- the duration.

In ghc-6.12 I think the unbuffered mode for input was simply abolished
so there is no longer a hGetLineUnBuffered case.

Duncan

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to