我用 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)
一切都很好,如果我从 lisp 调用 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”是在“HELLO”被打印之前打印的,这不是(progn ...)
应该如何工作的。它在前 2 个语句中正常工作。
我无法理解这种奇怪的行为。我用 SBCL 和 Clozure(在 Ubuntu 14.04 x64 上)对其进行了测试,两者都给出了相同的结果。