与progn一起使用时的common-lisp cffi评估顺序

时间:2014-12-01 05:09:03

标签: common-lisp cffi

我在C中创建了一个简单的共享库,只有一个函数:

void sayHello () {
    printf ("Hello World\n");
}

然后,在编译之后,我使用cffi:

将该库加载到lisp程序中
(cffi:define-foreign-library libtest1
    (t "./lib/libtest1.so"))

(cffi:use-foreign-library libtest1)

然后我使用cffi:defcfun:

定义了'sayHello'
(cffi:defcfun "sayHello" :void)

一切都很好,如果我从口齿不清中调用sayHello,它按预期工作:

? (sayHello)
Hello World
NIL
? 

(注意'?'是Clozure CL的REPL提示符)

现在我的实际问题,请注意:

? (progn (print 'hello) (print 'world))

HELLO 
WORLD 
WORLD
? (progn (sayHello) (print 'world))
Hello World

WORLD 
WORLD
? (progn (print 'hello) (sayHello))
Hello World

HELLO 
NIL
? 

我在REPL上发了3个语句。看看最后一个的输出,“Hello World”打印 BEFORE “HELLO”打印出来,这不是(progn ...)应该如何工作的。它适用于前两个陈述。

我无法理解这种奇怪的行为。我用SBCL和Clozure(在Ubuntu 14.04 x64上)进行了测试,两者都给出了相同的结果。

1 个答案:

答案 0 :(得分:3)

您的Lisp实现正在缓冲输出,并且只在显示下一个REPL提示符之前将其转储到终端上。如果需要,您需要显式刷新输出缓冲区。

? (progn (print 'hello) (finish-output) (sayHello))

HELLO Hello World

NIL