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 并未明确说明这些情况会发生什么;然而,直观地我以为在所有 4 种情况下 key-vals 都应该是映射。结果是,在前两种情况下它是映射,但在情况 3 和 4 中是 nil。我预期情况 3 和 4 每个都评估为空映射。

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]

我将看看指南是否需要在此处更清晰。

by
我在那些指导示例中添加了 `:as opts` 并展示了它绑定到的内容,包括绑定到 nil 的 "没有 kwargs" 的示例。
...