繁体   English   中英

在Clojure中,为什么assoc除了地图之外还需要参数,而dissoc则不需要?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM