【问题标题】:Lisp format and force-outputLisp 格式和强制输出
【发布时间】:2011-01-05 21:58:27
【问题描述】:

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

(format t "asdf")
(setq var (read))

在 CLISP 中,它的行为与预期一样,打印提示,然后读取,但在 SBCL 中,它读取的是 then 输出。我在网上看了一点,改了:

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

【问题讨论】:

    标签: io format common-lisp io-buffering


    【解决方案1】:

    您需要使用FINISH-OUTPUT

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

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

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

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

    • CLEAR-OUTPUT,尝试删除任何待处理的输出。

    不幸的是,FORCE-OUTPUTFORMAT 中的 T 并不相同。

    • force-output / finish-outputT*terminal-io*NIL*standard-output*

    • FORMAT:T*standard-output*

    这应该可行:

    (format t "asdf")
    (finish-output nil)   ;  note the NIL
    (setq var (read))
    

    【讨论】:

    猜你喜欢
    • 2015-11-12
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多