2024 状态调查中分享你的想法!

欢迎!请参阅关于页面以获取更多关于如何使用本站的信息。

+1
打印

我正在使用 clojure.pprint 库中的 cl-format 函数。我正在按照以下方式使用 ~:[ 指令:

(cl-format nil "~:[~;~a~]" arg)

当 arg 为 nil 时,我会得到预期的空字符串作为返回值。然而,当 arg 非nil,例如 1 时,我会得到一个错误:“格式定义的参数不足。” 当我为 cl-format 函数传递第二个参数时

(cl-format nil "~:[~;~a~]" 1 2)

它打印出 2,所以它看起来像它在吸收第一个参数以检查其非空字符,然后传递第二个到内部的格式指示符。

从我阅读 CL 编译超规范和 gigamonkies 格式参考资料来看,~:[ 不应该吸收参数,而应该将其传递到内部打印规范。这是 cl-format 实现的一个错误,还是我对规范的误解?

我已经看过代码,看起来在第 862 行,在https://github.com/clojure/clojure/blob/master/src/clj/clojure/pprint/cl_format.clj中执行 sub-format 的 navigator 参数应该是 arg-navigator。

1 个回答

0

选中
 
最佳答案

仔细观察,条件表达式消耗了一个条件参数,因此这是预期的行为。

如果您想要回退并使用消耗的参数,可以使用 ~:*

user=> (clojure.pprint/cl-format nil "~:[~;~:*~a~]" 100)
"100"
user=> (clojure.pprint/cl-format nil "~:[~;~:*~a~]" nil)
""

...