2013-03-08 124 views
10

我有一个奇怪的问题,功能timeoutgetch来自Haskell中使用的ncurses库。当我从GHCi或runhaskell使用它们时,它们按预期工作 - getch等待给予timeout的毫秒数,然后返回,即使没有给出输入。但是当我编译使用GHC的同一个文件,getch立即返回。解释和编译Haskell之间的ncurses的区别?

我尝试了两个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是否修改了一些微妙的终端设置?或者编译的代码加载库的方式不同?

新增:

席力图召从编译使用Haskell的FFI一个C程序,并立即返回(这是不正确的)。我认为这意味着问题不在图书馆,而是在GHC运行时的某个地方。

+0

如果上面显示的代码的行为与编译时描述的行为相同,则应该向库维护人员提交错误报告。 – didierc 2013-03-09 08:16:23

+0

Haskell库应该和C程序一样重要,它们在解释时可以正确工作,所以我不认为问题在这里。 – 2013-03-09 14:20:38

+0

好吧,它适用于我从repl或runhaskell。 – didierc 2013-03-09 15:06:21

回答

1

我想你的代码 - 具有较大的超时值略有修改 - 使用runhaskell和GHC用下面的命令:

$ runhaskell so_15305317.hs 

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

在这两种情况下,我结束了预期的行为。您的ghc安装必须为 损坏,或用于编译的命令,包括破坏库行为的参数。

在debian 6.0.5系统上,ghc版本是6.12.1,而hcurses是1.13.0.2。

+0

试着用相同的命令(只有包名是'hscurses'),得到了错误的结果。我的GHC是版本7.4.1,这可能是原因。 – 2013-03-09 16:27:40

+0

啊是的,这个名字确实是hscurses,这是我的答案错字。 – didierc 2013-03-09 16:37:35

+0

所以我想我们回到了bug报告的想法。 – didierc 2013-03-09 16:41:01

相关问题