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.
se il codice mostrato sopra si comporta realmente come descritto quando compilato, è necessario inviare una segnalazione di bug ai manutentori della libreria. – didierc
Le librerie Haskell dovrebbero essere essenzialmente identiche al programma C e funzionano correttamente se interpretate, quindi non penso che il problema sia qui. –
bene, funziona per me sia dal repl o con runhaskell. – didierc