Rob*_*son 12 format io common-lisp io-buffering
我不明白为什么这段代码在不同的实现中表现不同:
(format t "asdf")
(setq var (read))
Run Code Online (Sandbox Code Playgroud)
在CLISP中,它的行为与预期的一样,打印提示后跟读取,但在SBCL中读取,然后输出.我在网上读了一下并改了:
(format t "asdf")
(force-output t)
(setq var (read))
Run Code Online (Sandbox Code Playgroud)
这再次在CLISP中工作正常,但在SBCL中它仍然读取,然后输出.我甚至尝试将它分成另一个函数:
(defun output (string)
(format t string)
(force-output t))
(output "asdf")
(setq var (read))
Run Code Online (Sandbox Code Playgroud)
它仍然读取,然后输出.我没有force-output正确使用或者这只是SBCL的特质吗?
Rai*_*wig 24
你需要使用FINISH-OUTPUT.
在具有缓冲输出流的系统中,某些输出保留在输出缓冲区中,直到输出缓冲区已满(然后它将自动写入目标)或输出缓冲区明显清空.
Common Lisp有三个功能:
FINISH-OUTPUT,尝试确保完成所有输出然后返回.
FORCE-OUTPUT,启动剩余的输出,但IMMEDIATELY返回并且不等待所有输出完成.
CLEAR-OUTPUT,尝试删除任何挂起的输出.
不幸的是,Tin FORCE-OUTPUT和FORMAT不一样.
force-output/ finish-output: T是*terminal-io*和NIL是*standard-output*
FORMAT: T是的*standard-output*
这应该工作:
(format t "asdf")
(finish-output nil) ; note the NIL
(setq var (read))
Run Code Online (Sandbox Code Playgroud)