[英]Transforming a map with assoc and dissoc at the same time in clojure
[英]In clojure, why does assoc require arguments in addition to a map, but dissoc not?
在clojure,
(assoc {})
引发Arity异常,但是
(dissoc {})
才不是。 为什么? 我本来希望它们两个都抛出异常,或者在没有提供键或值的情况下两者都不做任何更改。
编辑 :我看到允许这些形式的理由; 这意味着我们可以将assoc或dissoc应用于可能为空的参数列表。 我只是不明白为什么一个人被允许而另一个人不被允许,我很好奇我是否缺少这样做的充分理由。
我个人认为缺少1-arity assoc是一个疏忽:无论何时需要尾随参数列表( & stuff
),该函数通常都应该能够使用零参数,以便可以将其apply
空值。清单。
Clojure还有许多其他功能可以使用零参数正确运行,例如+
和merge
。
另一方面,Clojure具有不接受零尾随参数的其他函数,例如conj
。
因此,Clojure API在这方面有点不一致。
这不是权威性的答案,而是基于我的测试并查看ClojureDocs:
dissoc的热情包括您能够传递一个论点,即一张地图。 在这种情况下,不会从地图中删除任何键/值。
(def test-map {:account-no 12345678 :lname "Jones" :fnam "Fred"})
(dissoc test-map)
{:account-no 12345678, :lname "Jones", :fnam "Fred"}
assoc没有类似的工具。 也就是说,调用assoc需要映射,键和值。
现在,为什么以这种方式设计这种方法是另一回事,如果您没有收到该信息的答案(希望您如此),那么我建议您提供赏金或访问Clojure的Google网上论坛并提出该问题。
这是来源。
(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))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.