请在2024 Clojure状态调查中分享您的想法!

欢迎!有关更多信息,请参阅关于页面。

+1
Clojure

我没有发现以下表达式的行为有文档说明。
请有人指出文档,或者我要求更新文档以警告这个注意事项。
请更新文档,以警告此注意事项。

https://clojure.org/guides/destructuring

((fn [& {:as key-vals}] key-vals) :a 100 :b 200) ;; case 1
(let [[& {:as key-vals}] '(:a 100 :b 200)] key-vals) ;; case 2

这两个表达式都评估为{:a 100 :b 200}映射。然而,以下表达式评估为nil而不是空映射。

((fn [& {:as key-vals}] key-vals) ) ;; case 3
(let [[& {:as key-vals}] ()] key-vals)  ;; case 4

标签https://clojure.org/guides/destructuring#_keyword_arguments并未确切说明在这些情况下会发生什么;然而,直观上我会预期在所有四种情况下key-vals都应该是一个映射。但实际上,在第一种和第二种情况下是一个映射,在第三种和第四种情况下却是nil。我预期第三种和第四种情况各自评估为一个空映射。

1个答案

+2

拆解在https://clojure.org/reference/special_forms#binding-forms中有文档说明,顶部写着:“由于数据(例如,序列结构的元素太少,关联结构中没有键等)不存在而与参数不匹配的绑定形式绑定到nil。”

与上面类似

(let [[a b] []] [a b])
;;=> [nil nil]
(let [[& es] []] es)
;;=> nil
(let [{:keys [a b], c :c} {}] [a b c])
;;=> [nil nil nil]

我会看看指南是否需要在这方面更加明确。

我在那些指南示例中添加了 `:as opts` 并展示了它绑定到什么,包括绑定到 nil 的“没有kwargs”示例。
...