Разница для ncurses между интерпретируемым и скомпилированным Haskell?
У меня странная проблема с функциями timeout
а также getch
из библиотеки ncurses, используемой в Haskell. Когда я использую их из GHCi или runhaskell, они работают как положено - getch
ожидает количество миллисекунд, переданных timeout
и затем возвращается, даже если не было введено никаких данных. Но когда я компилирую тот же файл, используя GHC, getch
возвращается немедленно.
Я попробовал две привязки ncurses для Haskell; hscurses
:
import UI.HSCurses.Curses
main = do
initCurses
timeout 1000
c <- getch
endWin
print c
а также ncurses
:
import UI.NCurses
main = do
e <- runCurses $ do
win <- defaultWindow
getEvent win $ Just 1000
print e
Оба ведут себя одинаково странным образом, описанным ранее.
Я также попробовал эквивалентную программу на C:
#include <ncurses.h>
int main()
{
initscr();
wtimeout(stdscr,1000);
int c = getch();
endwin();
printf("%d\n", c);
return 0;
}
Этот работает как ожидалось.
Итак, мой вопрос: что может иметь значение при использовании терминала из интерпретированного и скомпилированного Haskell? Изменяют ли runhaskell и ghci некоторые тонкие настройки терминала? Или скомпилированный код загружает библиотеки другим способом?
ДОБАВЛЕНО:
Я попытался вызвать C-программу из скомпилированного Haskell, используя FFI, и она сразу же вернулась (что неверно). Я думаю, это означает, что проблема не в библиотеках, а где-то во время выполнения GHC.
1 ответ
Я попробовал ваш код - слегка измененный с большим значением тайм-аута - используя runhaskell и ghc со следующими командами:
$ runhaskell so_15305317.hs
$ ghc -packages hscurses -lncurses so_15305317.hs
$ ./a.out
В обоих случаях я закончил с ожидаемым поведением. Ваша установка ghc должна быть нарушена, или команда, используемая для компиляции, включая параметры, нарушающие поведение библиотеки.
Версия ghc - 6.12.1, а hcurses - 1.13.0.2 в системе Debian 6.0.5.