我在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上)进行了测试,两者都给出了相同的结果。
答案 0 :(得分:3)
您的Lisp实现正在缓冲输出,并且只在显示下一个REPL提示符之前将其转储到终端上。如果需要,您需要显式刷新输出缓冲区。
? (progn (print 'hello) (finish-output) (sayHello))
HELLO Hello World
NIL