我不明白为什么这段代码在不同的实现中表现不同:
(format t "asdf")
(setq var (read))
在 CLISP 中,它的行为与预期一致,先打印提示,然后读取,但在 SBCL 中,它先读取,然后输出。我在网上看了一些内容并进行了修改:
(format t "asdf")
(force-output t)
(setq var (read))
这在 CLISP 中工作得很好,但在 SBCL 中它仍然读取,然后输出。我什至尝试将其分离到另一个函数中:
(defun output (string)
(format t string)
(force-output t))
(output "asdf")
(setq var (read))
它仍然读取,然后输出。我是否没有正确使用 force-output
或者这只是 SBCL 的一个特性?
最佳答案
您需要使用FINISH-OUTPUT
。
在具有缓冲输出流的系统中,一些输出保留在输出缓冲区中,直到输出缓冲区已满(然后它将自动写入目标)或输出缓冲区被显式清空。
Common Lisp 为此提供了三个函数:
FINISH-OUTPUT
,尝试确保所有输出完成然后返回。FORCE-OUTPUT
,开始剩余的输出,但立即返回并且不等待所有输出完成。CLEAR-OUTPUT
,尝试删除任何待处理的输出。
不幸的是,FORCE-OUTPUT
和 FORMAT
中的 T
并不相同。
force-output
/finish-output
:T
是*terminal-io*
并且NIL
是*标准输出*
格式
:T
是*标准输出*
这应该有效:
(format t "asdf")
(finish-output nil) ; note the NIL
(setq var (read))
关于io - Lisp 格式和强制输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2078490/