12

我不明白为什么这段代码在不同的实现中表现不同:

(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 的特性?

4

1 回答 1

25

你需要使用FINISH-OUTPUT.

在具有缓冲输出流的系统中,一些输出保留在输出缓冲区中,直到输出缓冲区已满(然后它将自动写入目标)或输出缓冲区显式清空。

Common Lisp 为此提供了三个功能:

  • FINISH-OUTPUT, 尝试确保所有输出都完成并返回。

  • FORCE-OUTPUT, 开始剩余的输出,但立即返回并且不等待所有输出完成。

  • CLEAR-OUTPUT, 尝试删除任何挂起的输出。

不幸的是,TinFORCE-OUTPUT和inFORMAT也不一样。

  • 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))
于 2010-01-16T18:54:26.883 回答