从格式调用完成输出

时间:2017-08-21 18:59:03

标签: format common-lisp bufferedstream

我注意到没有 这将是format指令 致电force-output/finish-output

为什么?

它似乎在用户交互中很有用,参见 Lisp format and force-output

例如,~=可以转换为finish-output~:=转换为force-output。 在这种情况下,我不认为clear-output有道理,但我们 为了完整性,可能会将~@=映射到它。

PS。参看CLISP RFE

1 个答案:

答案 0 :(得分:2)

comp.lang.lisp摘要:

Steven Haflich的解释

该语言没有定义扩展格式集的可移植方式 指令(除了~/.../之外),但这不是问题。 真正的问题是,在打印过程中在任意位置调用finish-output或类似函数的定义不明确。

如果正在进行漂亮打印,则会收到一个流 pprint-dispatchprint-object方法可能是封装流 - 一个暂时延迟输出,直到它可以做出决定 白色空间和换行符。 (如果有的话也有潜在的问题 finish-output~<理由中被调用,但该指令 是一个毛球!)如果被召唤,人们会期待finish-output做什么 在一个漂亮的打印操作?我认为它没有明确定义。

当然,问题不是格式化,而是指令 来自格式的finish-output只会为其添加另一个锐利边缘 语言。 finish-output等只有完全可以安全通话 在cl:write的实际或隐含电话之外。将其称为功能 在代码中的适当位置(您知道执行不是 在一个嵌套的写入内部)所以意图是明确的,你不要搞砸 打印机内部。

Rob Warnock的建议

实际上,不需要对format进行任何更改。只需在COMMON-LISP-USER package

中的某处添加此功能即可
(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