Как я могу получить правильный ввод, когда он набирается в Haskell? - PullRequest
1 голос
/ 29 марта 2012

Я написал интерпретатор Brainfuck в Haskell, но он работает только на входе, когда я нажимаю Ctrl-D, чтобы подать сигнал EOF.Как я могу заставить программу действовать на каждый символ, когда он набирается?

Здесь - источник.Чтобы использовать программу, дайте файл для интерпретации в качестве аргумента или введите вашу программу в первой строке стандартного ввода.

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

Похоже, ваш вход буферизуется.Вы можете изменить режим буферизации дескриптора файла с помощью System.IO.hSetBuffering.Например, если вы читаете со стандартного ввода, вы можете отключить буферизацию с помощью:

import System.IO

hSetBuffering stdin NoBuffering
1 голос
/ 29 марта 2012

getLine ожидает ввода символа новой строки (\n), потому что, что, если пользователь набрал набор символов, но никогда не нажимал клавишу ввода?Тогда было бы ошибкой, если часть «строки» уже была обработана, если эта «строка» в конце концов не была строкой.

Вместо этого следует использовать getContents, которая будет возвращать все, что естьнабирается в терминале.

Кроме того, вы используете следующую строку:

then hGetContents =<< openFile (head args) ReadMode

Это откроет файл и никогда не закроет его.Это хорошо для вашей короткой программы, но в будущем лучше бы привыкнуть к этому:

then readFile $ head args
...