Lisp格式和强制输出

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-OUTPUTFORMAT不一样.

  • 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)