我注意到没有
format
指令会调用force-output
/finish-output
。
为什么?
它似乎在用户交互中很有用,参见。 Lisp 格式和强制输出。
例如,~=
可以翻译为finish-output
和。我认为在这种情况下没有多大意义,但为了完整起见,我们可能会映射到它。~:=
force-output
clear-output
~@=
PS。参照。CLISP RFE。
我注意到没有
format
指令会调用force-output
/finish-output
。
为什么?
它似乎在用户交互中很有用,参见。 Lisp 格式和强制输出。
例如,~=
可以翻译为finish-output
和。我认为在这种情况下没有多大意义,但为了完整起见,我们可能会映射到它。~:=
force-output
clear-output
~@=
PS。参照。CLISP RFE。
来自comp.lang.lisp的总结:
该语言没有定义扩展格式指令集(其他 then )的可移植方式,~/.../
但这并不是真正的问题。真正的问题是finish-output
在打印期间在任意位置调用或类似函数的定义不明确。
如果正在进行漂亮打印,则
pprint-dispatch
orprint-object
方法接收到的流可能是一个封装流——它会暂时延迟输出,直到它可以做出有关空白和换行的决定。finish-output
(如果在理由中调用也有潜在的问题
~<
,但该指令是一个毛球!)如果在漂亮的打印操作中调用,人们会期望finish-output
做什么?我不认为它定义得很好。
当然,问题不是格式所特有的,但是
finish-output
from format 的指令只会为语言增加另一个锋利的边缘。 finish-output
等只有在完全不在实际或暗示调用 . 的情况下才能安全调用cl:write
。在代码中的适当位置(您知道执行不在嵌套写入中)将其作为函数调用,这样意图就很清楚,您不会弄乱打印机内部结构。
实际上,不需要更改format
。只需在COMMON-LISP-USER 包中的某处添加此功能:
(defun fo (stream arg colon-p atsign-p &rest params)
(declare (ignore arg params))
(cond
(colon-p (force-output stream))
(atsign-p (clear-output stream))
(t (finish-output stream))))
然后:
(progn
(format t "enter var: ~/fo/" nil)
(read))
enter var: 456
456
这种(便携式!)方法的问题是
~/fo/
而不是~=
)nil
在上面的示例中)