2013-03-08 6 views
10

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.

+0

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

+0

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. –

+0

nun, es funktioniert für mich entweder aus dem repl oder mit runhaskell. – didierc

Antwort

1

ich Ihren Code versuche - etwas mit einem größeren Timeout-Wert verändert - runhaskell und ghc mit den folgenden Befehlen:

$ runhaskell so_15305317.hs 

$ ghc -packages hscurses -lncurses so_15305317.hs 
$ ./a.out 

In beiden Fällen kam ich mit dem erwarteten Verhalten auf. Ihre Installation von ghc muss unterbrochen sein, oder der Befehl, der für die Kompilierung verwendet wird, einschließlich Parameter, die das Verhalten der Bibliothek unterbrechen.

GhC-Version ist 6.12.1 und hcurses ist 1.13.0.2, auf einem debian 6.0.5-System.

+0

Versucht mit den gleichen Befehlen (nur der Paketname ist 'hscurses'), bekam das falsche Ergebnis. Mein GHC ist Version 7.4.1, was der Grund sein könnte. –

+0

ah ja, der Name ist in der Tat hscurses, es ist ein Tippfehler in meiner Antwort. – didierc

+0

also denke ich, wir sind zurück zu der Bug-Report-Idee. – didierc