2016-08-07 29 views
0

von Windows-Comming habe ich vor kurzem Linux-Distribution namens Peppermint und Haskell-Plattform über bash (ghc 7,10) installiert, aber es muss etwas falsch mit GHCI stdin in GHCI sein, weil:Lesen stdin in GHCI auf Linux gebrochen

interact $ take 0 löst einen Fehler aber interact $ take 1 nicht aus.

Außerdem, wenn ich backspace verwenden, arrows oder jede andere Steuertaste, wenn sie in stdin schreiben, es tritt in das Zeichen Symbol. Zum Beispiel Backspace tritt ^? in GHCI statt das letzte Zeichen getippt ...

[email protected] ~ $ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> interact $ take 0 
Prelude> 
<stdin>: hGetChar: illegal operation (handle is closed) 
[email protected] ~ $ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> readLn :: IO String 
euoe^?^?^[[1;5C^[[D^[[B -- here I tried to delete 'euoe' 
+0

Wie läuft das Programm? Was erwartest du auch? GHCI scheint alles auszuführen, was reingehört wird, daher bin ich mir nicht sicher, ob du jemals wieder stdin lesen kannst. – pdexter

+2

Dies sieht im Zusammenhang mit Ihrem Problem: http://stackoverflow.com/questions/38776023/handle-is-semi-closed-error-in-haskell – villou24

+3

"interagieren" und GHCi nicht gut, IIRC. 'interactive' will ALL die stdin für sich selbst, und GHCi kann es nicht zurückbekommen. – chi

Antwort

3

In Bezug auf den Steuercode Literale löschen, ist dies, weil Sie es geschafft haben, alle die zu entkommen Zeileneditoren (Readline, Haskeline), die normalerweise Ihre Tastendrücke interpretieren würden.

Ich kenne die Einzelheiten nicht, aber GHCi aufrufen ist so etwas wie das Starten einer Subshell mit bash --noediting. Dadurch kann GHCi rohe Tastendrücke ohne Störungen durch die readline-Bibliothek empfangen. Dies wird getan, weil Haskeline —, die GHCi anstelle von Readline — verwendet, mit Dingen wie Tab Completion für die verfügbaren Funktionen einfacher konfiguriert werden kann (Sie wussten, GHCi zur Verfügung gestellt Registerkarte Abschluss, oder?).

Der Aufruf von getLine von GHCi fällt dann effektiv durch eine Falltür und weicht Haskeline vollständig aus, indem er direkt auf die Standardeingabe geht. Es gibt schließlich nur eine Stdin. Sie tippen jetzt direkt in ein ungepuffertes Terminal.

Zurück zu Ihrer ersten Sorge, es gibt nur eine stdin ist auch, warum GHCi sofort nach dem Drucken der Prelude> prompt kiel. interact (die hGetContents hinter den Kulissen verwendet) behauptet, dass es alle Eingaben ansprechen wird, die jemals durch das Handle (stdin) als eine große faule String kommen werden. Effektiv kann es keine verbleibende Eingabe auf dem Handle geben, die interact nicht schon beansprucht hat, damit umzugehen, so wird der Handle sofort in einen “ halbgeschlossenen ” Zustand versetzt. Es ist nicht geschlossen (es könnte noch mehr Eingang sein, der als Teil dieser faulen String gets! Gelesen wird), aber es ist ist für alle Neulinge geschlossen, sonst würde Eingabe (interact und neue Leser des Handle wie getLine Duplikate erhalten werden würde die gleiche Linie bekommen!).

Zurück zu GHCi, nachdem interact verwendet wurde, ist stdout immer noch in Ordnung, also wird die Aufforderung wie üblich gedruckt, dann lehnt GHCi auf Haskeline, um eine Linie für die Verarbeitung zurückzugeben. Haskeline (als Zeileneditor) ruft eine Blockierung getChar (iirc) auf, um entweder ein Zeichen zur Zeile hinzuzufügen oder einen Zeilenbearbeitungsbefehl auszuführen, und stirbt, weil es ein halbgeschlossenes Handle adressiert. So fällt eine schwächere Kreatur und das große Rad des Lebens rollt weiter.

+0

Danke, Die Steuercode Literale sind wirklich Schmerzen, weil ich keinen Tipp machen kann ... Windows Ghci irgendwie geschafft, sie auf die richtige Weise zu interpretieren, so bin ich verwirrt, warum Linux Ghci nicht kann. –