首页 文章

在clojure中,为什么assoc除了 Map 之外还需要参数,但不是?

提问于
浏览
8

在clojure中,

(assoc {})

抛出一个arity例外,但是

(dissoc {})

才不是 . 为什么?我希望他们两个都抛出一个异常,或者两个都没有提供任何键或值时不做任何更改 .

EDIT :我看到了允许这些形式的理由;这意味着我们可以将assoc或dissoc应用于可能为空的参数列表 . 我只是想知道是否有's a good reason for this that I'米失踪 .

2 回答

  • 4

    我个人认为缺少1-arity assoc是一种疏忽:每当一个参数的尾随列表被预期时( & stuff ),该函数通常应该能够使用零参数,以便能够 apply 它到一个空列表 .

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

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

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

  • 0

    这不是一个权威的答案,而是基于我的测试并查看ClojureDocs:

    dissoc的精神包括你能够传递一个参数,一张 Map . 在这种情况下,不会从 Map 中删除键/值 .

    (def test-map {:account-no 12345678 :lname "Jones" :fnam "Fred"})
    (dissoc test-map)
    {:account-no 12345678, :lname "Jones", :fnam "Fred"}
    

    assoc没有类似的arity . 那就是调用assoc需要一个map,key和value .

    现在为什么设计这种方式是另一回事,如果你没有得到这些信息的答案 - 我希望你这样做 - 那么我建议你提供赏金或者去Clojure的谷歌小组并提出这个问题 .

    这是来源 .

    (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))))
    

相关问题