Ich habe ein seltsames Problem mit den Funktionen timeout
und getch
aus der Ncurses-Bibliothek in Haskell verwendet. Wenn ich sie von GHCi oder rushaskell verwende, funktionieren sie wie erwartet - getch
wartet auf die Anzahl von Millisekunden, die an timeout
gegeben werden, und kehrt dann zurück, auch wenn keine Eingabe gegeben wurde. Aber wenn ich kompiliere die gleiche Datei mit GHC, getch
kehrt sofort zurück.Unterschied für Ncurses zwischen interpretierten und kompilierten Haskell?
Ich habe zwei Ncurses-Bindungen für Haskell ausprobiert; hscurses
:
import UI.HSCurses.Curses
main = do
initCurses
timeout 1000
c <- getch
endWin
print c
und ncurses
:
import UI.NCurses
main = do
e <- runCurses $ do
win <- defaultWindow
getEvent win $ Just 1000
print e
Sowohl vor als die gleiche seltsame Art und Weise beschrieben verhalten.
Ich habe auch versucht gleichwertiges Programm in C:
#include <ncurses.h>
int main()
{
initscr();
wtimeout(stdscr,1000);
int c = getch();
endwin();
printf("%d\n", c);
return 0;
}
Dieser funktioniert wie erwartet.
Also meine Frage ist: Was kann den Unterschied ausmachen, wenn Terminal aus interpretierten und aus kompilierten Haskell verwendet? Ändern runhaskell und ghci einige subtile Terminaleinstellungen? Oder lädt der kompilierte Code Bibliotheken anders?
ADDED:
I versucht, ein C-Programm von kompilierten Haskell zu nennen FFI verwenden und es kehrte sofort (was nicht korrekt ist). Ich denke, das bedeutet, dass das Problem nicht in den Bibliotheken liegt, sondern irgendwo in der Laufzeit von GHC.
Wenn sich der oben gezeigte Code tatsächlich so verhält, wie er beim Kompilieren beschrieben wurde, sollten Sie einen Fehlerbericht an die Bibliotheksverwalter senden. – didierc
Die Haskell-Bibliotheken sollten im Wesentlichen das gleiche wie das C-Programm tun, und sie funktionieren korrekt, wenn sie interpretiert werden, also glaube ich nicht, dass das Problem hier ist. –
nun, es funktioniert für mich entweder aus dem repl oder mit runhaskell. – didierc