2013-03-08 18 views
10

Ho uno strano problema con le funzioni timeout e getch dalla libreria ncurses utilizzata in Haskell. Quando li utilizzo da GHCi o runhaskell, funzionano come previsto: getch attende il numero di millisecondi assegnato a timeout e quindi restituisce, anche se non è stato fornito alcun input. Ma quando I compila lo lo stesso file utilizzando GHC, getch restituisce immediatamente.Differenza per ncurses tra Haskell interpretato e compilato?

Ho provato due binding ncurses per Haskell; hscurses:

import UI.HSCurses.Curses 

main = do 
    initCurses 
    timeout 1000 
    c <- getch 
    endWin 
    print c 

e ncurses:

import UI.NCurses 

main = do 
    e <- runCurses $ do 
    win <- defaultWindow 
    getEvent win $ Just 1000 
    print e 

Entrambi si comportano allo stesso modo strano descritto in precedenza.

Ho anche provato programma equivalente in C:

#include <ncurses.h> 

int main() 
{ 
    initscr(); 
    wtimeout(stdscr,1000); 
    int c = getch(); 
    endwin(); 
    printf("%d\n", c); 
    return 0; 
} 

Questo funziona come previsto.

Quindi la mia domanda è: cosa può fare la differenza quando si utilizza il terminale da interpretato e da Haskell compilato? Runhaskell e ghci modificano alcune impostazioni del terminale sottili? O il codice compilato carica le librerie in un modo diverso?

aggiunto:

ho provato a richiamare un programma C da compilato Haskell utilizzando FFI e tornato immediatamente (che non è corretto). Penso che ciò significhi che il problema non è nelle librerie, ma da qualche parte nel runtime di GHC.

+0

se il codice mostrato sopra si comporta realmente come descritto quando compilato, è necessario inviare una segnalazione di bug ai manutentori della libreria. – didierc

+0

Le librerie Haskell dovrebbero essere essenzialmente identiche al programma C e funzionano correttamente se interpretate, quindi non penso che il problema sia qui. –

+0

bene, funziona per me sia dal repl o con runhaskell. – didierc

risposta

1

ho provato il codice - leggermente modificato con un valore di timeout più grande - con runhaskell, e GHC con i seguenti comandi:

$ runhaskell so_15305317.hs 

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

In entrambi i casi, ho finito con il comportamento previsto. L'installazione di ghc deve essere interrotta o il comando utilizzato per la compilazione compresi i parametri che infrangono il comportamento della libreria.

versione ghc è 6.12.1, e hcurses è 1.13.0.2, su un sistema debian 6.0.5.

+0

Provato con gli stessi comandi (solo il nome del pacchetto è 'hscurses'), ha ottenuto il risultato sbagliato. My GHC è la versione 7.4.1, che potrebbe essere la ragione. –

+0

ah sì, il nome è davvero hscurses, è un errore di battitura nella mia risposta. – didierc

+0

quindi immagino che torneremo all'idea della segnalazione bug. – didierc