0

我用 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 上)对其进行了测试,两者都给出了相同的结果。

4

1 回答 1

3

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

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

HELLO Hello World

NIL
于 2014-12-01T06:15:01.017 回答