【问题标题】:common-lisp cffi evaluation order when used with progn与 progn 一起使用时的 common-lisp cffi 评估顺序
【发布时间】:2014-12-01 05:09:02
【问题描述】:

我用 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”被打印BEFORE“HELLO”被打印,这不是(progn ...) 应该如何工作的。它在前 2 个语句中正常工作。

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

【问题讨论】:

    标签: common-lisp cffi


    【解决方案1】:

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

    ? (progn (print 'hello) (finish-output) (sayHello))
    
    HELLO Hello World
    
    NIL
    

    【讨论】:

    • 是的,这解决了我的问题,tnx。我怀疑缓冲或对 stdout 的 i/o 是通过另一个线程处理的(clozure 文档谈到了两个进程)。现在我确信它的缓冲作用。
    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多