windows haskell io ghc buffering

windows - Haskell: lea el carácter de entrada desde la consola inmediatamente, no después de la nueva línea



io ghc (4)

El paquete Haskeline funcionó para mí.

Si lo necesita para caracteres individuales, simplemente cambie la muestra ligeramente.

  1. getInputLine convierte en getInputChar
  2. "quit" convierte en ''q''
  3. ++ input convierte en ++ [input]

main = runInputT defaultSettings loop where loop :: InputT IO () loop = do minput <- getInputChar "% " case minput of Nothing -> return () Just ''q'' -> return () Just input -> do outputStrLn $ "Input was: " ++ [input] loop

He intentado esto:

main = do hSetBuffering stdin NoBuffering c <- getChar

pero espera hasta que se presione la tecla enter, que no es lo que quiero. Quiero leer el personaje inmediatamente después de que el usuario lo presiona.

Estoy usando ghc v6.12.1 en Windows 7.

EDITAR: la solución para mí fue pasar de GHC a WinHugs, que lo admite correctamente.


Hmm .. En realidad, no puedo ver esta característica como un error. Cuando lee stdin eso significa que quiere trabajar con un "archivo" y cuando pasa el búfer, está diciendo que no hay necesidad de leer el búfer. Pero eso no significa que la aplicación que está emulando ese "archivo" no debería usar el buffer de escritura. Para Linux, si su terminal está en modo "icanon", no envía ninguna entrada hasta que ocurra algún evento especial (como Enter presionado o Ctrl + D). Probablemente la consola en Windows tiene algunos modos similares.


Podría ser un error:

http://hackage.haskell.org/trac/ghc/ticket/2189

El siguiente programa repite los caracteres ingresados ​​hasta que se presiona la tecla de escape.

import IO import Monad import Char main :: IO () main = do hSetBuffering stdin NoBuffering inputLoop inputLoop :: IO () inputLoop = do i <- getContents mapM_ putChar $ takeWhile ((/= 27) . ord) i

Debido a la línea hSetBuffering stdin NoBuffering, no debería ser necesario presionar la tecla enter entre pulsaciones de teclas. Este programa funciona correctamente en WinHugs (versión sep 2006). Sin embargo, GHC 6.8.2 no repite los caracteres hasta que se presiona la tecla enter. El problema se reprodujo con todos los ejecutables de GHC (ghci, ghc, runghc, runhaskell), utilizando tanto cmd.exe como command.com en Windows XP Professional ...


Sí, es un error. Aquí hay una solución para evitar que las personas hagan clic y se desplacen:

{-# LANGUAGE ForeignFunctionInterface #-} import Data.Char import Foreign.C.Types getHiddenChar = fmap (chr.fromEnum) c_getch foreign import ccall unsafe "conio.h getch" c_getch :: IO CInt

De modo que puede reemplazar llamadas a getChar con llamadas a getHiddenChar .

Tenga en cuenta que esta es una solución para ghc / ghci en Windows. Por ejemplo, winhugs no tiene el error y este código no funciona en winhugs.