8

在clojure中,

(assoc {})

抛出一个arity异常,但是

(dissoc {})

才不是。为什么?我本来希望他们俩都抛出异常,或者在没有提供键或值时都不会进行任何更改。

编辑:我看到了允许这些表格的理由;这意味着我们可以将 assoc 或 dissoc 应用于可能为空的参数列表。我只是不明白为什么一个会被允许而另一个不会,我很好奇我是否有充分的理由错过这一点。

4

2 回答 2

4

我个人认为缺少 1-arity assoc 是一个疏忽:每当需要一个尾随参数列表 ( & stuff) 时,该函数通常应该能够使用零参数,以使其成为apply一个空列表。

Clojure 有许多其他函数可以使用零参数正常工作,例如+merge.

另一方面,Clojure 有其他接受零尾随参数的函数,例如conj.

所以Clojure API在这方面有点不一致.....

于 2013-04-24T13:36:13.273 回答
0

这不是一个权威的答案,而是基于我的测试和查看 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))))
于 2013-04-23T19:45:00.820 回答