4

我注意到没有 format指令会调用force-output/finish-output

为什么?

它似乎在用户交互中很有用,参见。 Lisp 格式和强制输出

例如,~=可以翻译为finish-output和。我认为在这种情况下没有多大意义,但为了完整起见,我们可能会映射到它。~:=force-outputclear-output~@=

PS。参照。CLISP RFE

4

1 回答 1

2

来自comp.lang.lisp的总结:

Steven Haflich 的解释

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

如果正在进行漂亮打印,则 pprint-dispatchorprint-object方法接收到的流可能是一个封装流——它会暂时延迟输出,直到它可以做出有关空白和换行的决定。finish-output(如果在理由中调用也有潜在的问题 ~<,但该指令是一个毛球!)如果在漂亮的打印操作中调用,人们会期望finish-output做什么?我不认为它定义得很好。

当然,问题不是格式所特有的,但是 finish-outputfrom format 的指令只会为语言增加另一个锋利的边缘。 finish-output等只有在完全不在实际或暗示调用 . 的情况下才能安全调用cl:write。在代码中的适当位置(您知道执行不在嵌套写入中)将其作为函数调用,这样意图就很清楚,您不会弄乱打印机内部结构。

Rob Warnock 的建议

实际上,不需要更改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在上面的示例中)
于 2017-08-23T17:36:40.967 回答