我注意到没有format
指令,这将 呼叫force-output
/finish-output
。
为什么?
它似乎在用户交互中很有用,参见。 Lisp 格式和强制输出。
例如,~=
可以翻译成finish-output
,~:=
可以翻译成force-output
。 我认为在这种情况下clear-output
没有多大意义,但我们 可能会将~@=
映射到它以确保完整性。
参看《联邦法律自由条例》。
comp.lang.lisp 的摘要:
史蒂文·哈夫利希的解释
该语言没有定义扩展格式集的可移植方法 指令(除了~/.../
之外(,但这不是这里真正的问题。 真正的问题是,在打印过程中,没有很好地定义在任意位置调用finish-output
或类似函数。
如果正在进行漂亮打印,则由pprint-dispatch
或print-object
方法可能是封装流 -- 一种暂时延迟输出,直到它可以做出以下决策 空格和换行符。 (如果finish-output
是在~<
理由内调用的,但该指令 是一个毛球! 如果被召唤,人们会期望finish-output
做什么 在一个漂亮的打印操作中? 我认为它的定义并不明确。
当然,问题不在于格式,而在于 格式finish-output
只会给 语言。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
在上面的示例中(