按预期正常工作的示例
`
Clojure 1.7.0-master-SNAPSHOT
user=> (dissoc {})
{}
user=> (disj #{})
{}
user=> (conj {})
{}
user=> (conj [])
[]
`
按预期未工作的示例,但被建议的补丁更改
`
user=> (assoc {})
ArityException 传递给:core/assoc 参数数量错误(1) clojure.lang.AFn.throwArity (AFn.java:429)
user=> (assoc! (transient {}))
ArityException 传递给:core/assoc! 参数数量错误(1) clojure.lang.AFn.throwArity (AFn.java:429)
user=> (dissoc! (transient {}))
ArityException 传递给:core/dissoc! 参数数量错误(1) clojure.lang.AFn.throwArity (AFn.java:429)
;; 补丁允许 conj! 多个参数,如 conj
user=> (conj! (transient []) 1 2 3)
ArityException 传递给:core/conj! 参数数量错误(4) clojure.lang.AFn.throwArity (AFn.java:429)
;; 补丁会报错,而不是静默使用 nil 作为最后值来处理缺少的最后一个键值对 assoc! 的情况
user=> (assoc! (transient {}) 1 2 3)
object[clojure.lang.PersistentArrayMap$TransientArrayMap 0x2e7569b8 "clojure.lang.PersistentArrayMap$TransientArrayMap@2e7569b8"]
`
我仔细查阅了其余代码,发现它们在其他一些方面也存在差异,例如:处理不同数量的参数的方式,例如
- conj 处理任意数量的参数,而 conj! 不处理。
- assoc 检查是否有未指定值的最后一个键(CLJ-1052),而 assoc! 没有这样做。
历史/讨论:在 Clojure Google 群组中关于 conj 仅将一个集合作为参数时出现错误,而 disj 可用于此情况的讨论
https://groups.google.com/forum/?fromgroups=#!topic/clojure/Z9mFxsTYTqQ
筛选者: Alex Miller