Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp 与progn一起使用时的通用lisp cffi求值顺序_Common Lisp_Cffi - Fatal编程技术网

Common lisp 与progn一起使用时的通用lisp cffi求值顺序

Common lisp 与progn一起使用时的通用lisp cffi求值顺序,common-lisp,cffi,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

我用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…
应该如何工作的。它在前两条语句中工作正常


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

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

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

HELLO Hello World

NIL

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

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

HELLO Hello World

NIL

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

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

HELLO Hello World

NIL

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

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

HELLO Hello World

NIL

是的,这解决了我的问题,tnx。我怀疑缓冲或对标准输出的I/o是通过另一个线程处理的(clozure文档讨论了两个进程)。现在我确信它是缓冲的。是的,这解决了我的问题,tnx。我怀疑缓冲或对标准输出的I/o是通过另一个线程处理的(clozure文档讨论了两个进程)。现在我确信它是缓冲的。是的,这解决了我的问题,tnx。我怀疑缓冲或对标准输出的I/o是通过另一个线程处理的(clozure文档讨论了两个进程)。现在我确信它是缓冲的。是的,这解决了我的问题,tnx。我怀疑缓冲或对标准输出的I/o是通过另一个线程处理的(clozure文档讨论了两个进程)。现在我确信这是一种缓冲。