2012-03-28 19 views
1

Ich habe einen Brainfuck Interpreter in Haskell geschrieben, aber es funktioniert nur am Eingang, sobald ich Strg-D drücke, um EOF zu signalisieren. Wie kann ich das Programm so einstellen, dass es bei der Eingabe auf jedes Zeichen einwirkt?Wie kann ich direkt beim Eingeben von Haskell Eingaben erhalten?

Here ist die Quelle. Um das Programm zu verwenden, geben Sie eine Datei als Argument ein oder geben Sie Ihr Programm in die erste Zeile von stdin ein.

Antwort

3

Es klingt wie Sie Ihre Eingabe gepuffert wird. Sie können den Puffermodus eines Dateihandle mit System.IO.hSetBuffering ändern. Wenn Sie von der Standardeingabe lesen, zum Beispiel, dann könnten Sie deaktivieren Pufferung mit:

import System.IO 

hSetBuffering stdin NoBuffering 
+0

Ich versuchte das, aber es wartete immer noch, bis ich Strg-D drücke, bevor ich eine Antwort auf meine Eingabe gab. – dlahoti

+1

Ich habe 'stdout's Puffermodus in' NoBuffering' geändert, und das hat das Problem gelöst. – dlahoti

1

getLine wartet auf ein Zeilenumbruch Zeichen eingegeben werden (\n), denn was ist, wenn der Benutzer eine Reihe von Zeichen eingegeben, aber nie gedrückt Enter? Dann wäre es ein Fehler, wenn ein Teil der "Zeile" schon bearbeitet worden wäre, wenn diese "Zeile" doch keine Zeile wäre.

Sie sollten stattdessen getContents verwenden, was alles zurückgibt, was am Terminal eingegeben wurde.

Auch verwenden Sie die folgende Zeile:

then hGetContents =<< openFile (head args) ReadMode 

Dadurch wird eine Datei öffnen und es nie schließen. Das ist in Ordnung für Ihr Kurzprogramm, aber es könnte eine bessere Idee für die Zukunft daran gewöhnen zu tun:

then readFile $ head args 
+0

Das Problem liegt nicht bei der 'getLine' am Anfang, sondern mit den' getChar' nahe dem Ende (in der 'exec'-Funktion). – dlahoti

Verwandte Themen