2024 Clojure 状态调查! 分享您的想法。

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

+1
打印

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

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

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

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

它打印了 2,所以它好像是在吸收第一个参数以检查其非 nil 字符,然后将第二个参数传递给内部格式指令。

根据我对 CL Hyperspec 和 gigamonkies 格式参考的阅读,~:[] 应该不会吸收参数,而是将其传递给内部打印规范。这是 cl-format 实现中的错误,还是我对规范的误解?

我已经查看源代码,它确实看起来像是第 862 行的 https://github.com/clojure/clojure/blob/master/src/clj/clojure/pprint/cl_format.clj 中的执行子格式化的 navigator 参数应该是 arg-navigator。

1 个答案

0

选定
 
最佳答案

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

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

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

...