在clojure中,
(assoc {})
抛出一个arity异常,但是
(dissoc {})
才不是。为什么?我本来希望他们俩都抛出异常,或者在没有提供键或值时都不会进行任何更改。
编辑:我看到了允许这些表格的理由;这意味着我们可以将 assoc 或 dissoc 应用于可能为空的参数列表。我只是不明白为什么一个会被允许而另一个不会,我很好奇我是否有充分的理由错过这一点。
在clojure中,
(assoc {})
抛出一个arity异常,但是
(dissoc {})
才不是。为什么?我本来希望他们俩都抛出异常,或者在没有提供键或值时都不会进行任何更改。
编辑:我看到了允许这些表格的理由;这意味着我们可以将 assoc 或 dissoc 应用于可能为空的参数列表。我只是不明白为什么一个会被允许而另一个不会,我很好奇我是否有充分的理由错过这一点。
我个人认为缺少 1-arity assoc 是一个疏忽:每当需要一个尾随参数列表 ( & stuff
) 时,该函数通常应该能够使用零参数,以使其成为apply
一个空列表。
Clojure 有许多其他函数可以使用零参数正常工作,例如+
和merge
.
另一方面,Clojure 有其他不接受零尾随参数的函数,例如conj
.
所以Clojure API在这方面有点不一致.....
这不是一个权威的答案,而是基于我的测试和查看 ClojureDocs:
dissoc的 arity 包括您能够传入一个参数,即地图。在这种情况下,不会从地图中删除任何键/值。
(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))))