why are `disj` and `dissoc` distinct functions in Clojure?
据我所知,Clojure的核心功能几乎总是适用于不同类型的集合,例如
1 2 | (dissoc map) (dissoc map key) (dissoc map key & ks) (disj set) (disj set key) (disj set key & ks) |
和相当相似的语义 为什么这两个功能都没有覆盖? 我可以看到的唯一支持此观点的论点是,地图同时具有
我可以编写一个单行函数来处理这种情况,但是Clojure在很多情况下是如此优雅,以至于它在不是它的时候对我来说真的很震撼:)
只是为了与Arthur的答案相反:
我猜想这是出于美学选择,实际上可能与地图支持
1 2 3 4 5 6 7 | ;; hypothetical disj on map (disj {:foo 1 [:foo 1] 2 {:foo 1 [:foo 1] 2} 3} } {:foo 1 [:foo 1] 2} ;; [:foo 1] similarly problematic ) |
那应该返回
因此,对地图使用
现在,从理论上讲
尝试回答他人的动机总是可疑的,尽管我强烈怀疑这是core.clj中的引导问题。这两个函数都是在core.clj的早期定义的,并且几乎相同,只是它们每个都只采用一种类型并直接对其调用方法。
1 | (. clojure.lang.RT (dissoc map key)) |
和
1 | (. set (disjoin key)) |
这两个函数都是在
1 2 3 4 5 6 7 8 9 10 11 12 | (defn del "Removes elements from coll which can be set, vector, list, map or string" [ coll & rest ] (let [ [ w & tail ] rest ] (if w (apply del (cond (set? coll) (disj coll w) (list? coll) (remove #(= w %) coll) (vector? coll) (into [] (remove #(= w % ) coll)) (map? coll) (dissoc coll w) (string? coll) (.replaceAll coll (str w)"")) tail) coll))) |
谁在乎?只需使用上面的功能,而忘记过去...