我不明白为什么这段代码在不同的实现中表现不同:
(format t "asdf")
(setq var (read))
在 CLISP 中,它的行为与预期一致,先打印提示,然后读取,但在 SBCL 中,它显示:then输出。我在网上查了一下,修改了一下:
(format t "asdf")
(force-output t)
(setq var (read))
同样,这在 CLISP 中运行良好,但在 SBCL 中则不然still读取,然后输出。我什至尝试将其分离成另一个函数:
(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
,尝试删除任何挂起的输出。
还有T
in FORCE-OUTPUT
and FORMAT
不幸的是不一样。
这应该有效:
(format t "asdf")
(finish-output nil) ; note the NIL
(setq var (read))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)