io - Lisp 格式和强制输出

标签 io format common-lisp io-buffering

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

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

最佳答案

您需要使用FINISH-OUTPUT

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

Common Lisp 具有三个函数:

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

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

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

此外 FORCE-OUTPUTFORMAT 中的 T 不幸的是不一样。

  • force-output/finish-output:T*terminal-io* 并且NIL*standard-output*

  • 格式:T*standard-output*

这应该有效:

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

关于io - Lisp 格式和强制输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3486808/

相关文章:

c# - 递归地将目录名称附加到字符串

vba - 如何更改条件格式单元格的内部颜色索引

python - 将 timedelta 格式化为字符串

linux - SBCL 错误 : "binding stack exhausted" when running Maxima on Linux machine

emacs - Mac 上的 Lisp 开发

lisp - 如何在ACL2中使用递归进行循环?

c - 如何计算文件中的位数?

基于 Web 的 CSV 导出的 Java IO 异常

c - 高效地读取 C 中的扁平化文件

format - 有没有办法将 Octave 中的输出格式设置为给定数量的有效数字?