Lisp格式和强制输出

By simon at 2018-02-28 • 0人收藏 • 45人看过

我不明白为什么这个代码在不同的行为上有所不同 实现:

(format t "asdf")
(setq var (read))
在CLISP中,它的行为将会是e预计,随后打印提示 读取,但在SBCL中读取the输出。我在网上看了一下 和ch愤怒:
(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的特质?

2 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

你需要使用FINISH-OUTPUT。 在具有缓冲输出流的系统中,某些输出保留在输出中 缓冲区直到输出缓冲区已满(然后它会被自动写入 到目的地)或输出缓冲区清空。 Common Lisp有三个功能:   * FINISH-OUTPUT,尝试确保所有输出完成,然后返回。   * FORCE-OUTPUT,启动剩余的输出,但是立即返回并且不等待所有输出完成。   * CLEAR-OUTPUT,尝试删除任何未决的输出。 不幸的是FORCE-OUTPUT和FORMAT中的T也是不幸的 不一样。   * 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))

2018-02-28   #2

你需要使用FINISH-OUTPUT。 在具有缓冲输出流的系统中,某些输出保留在输出中 缓冲区直到输出缓冲区已满(然后它会被自动写入 到目的地)或输出缓冲区清空。 Common Lisp有三个功能:   * FINISH-OUTPUT,尝试确保所有输出完成,然后返回。   * FORCE-OUTPUT,启动剩余的输出,但是立即返回并且不等待所有输出完成。   * CLEAR-OUTPUT,尝试删除任何未决的输出。 不幸的是FORCE-OUTPUT和FORMAT中的T也是不幸的 不一样。   * 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))

登录后方可回帖

Loading...