(defn dissoc
"dissoc[iate]. Returns a new map of the same (hashed/sorted) type,
that does not contain a mapping for key(s)."
{:added "1.0"
:static true}
([map] map)
([map key]
(. clojure.lang.RT (dissoc map key)))
([map key & ks]
(let [ret (dissoc map key)]
(if ks
(recur ret (first ks) (next ks))
ret))))
2 回答
我个人认为缺少1-arity assoc是一种疏忽:每当一个参数的尾随列表被预期时(
& stuff
),该函数通常应该能够使用零参数,以便能够apply
它到一个空列表 .Clojure有许多其他函数可以正确地使用零参数,例如
+
和merge
.另一方面,Clojure具有不接受零尾随参数的其他功能,例如,
conj
.所以Clojure API在这方面有点不一致.....
这不是一个权威的答案,而是基于我的测试并查看ClojureDocs:
dissoc的精神包括你能够传递一个参数,一张 Map . 在这种情况下,不会从 Map 中删除键/值 .
assoc没有类似的arity . 那就是调用assoc需要一个map,key和value .
现在为什么设计这种方式是另一回事,如果你没有得到这些信息的答案 - 我希望你这样做 - 那么我建议你提供赏金或者去Clojure的谷歌小组并提出这个问题 .
这是来源 .