符合预期的示例
`
Clojure 1.7.0-master-SNAPSHOT
user=> (dissoc {})
{}
user=> (disj #{})
{}
user=> (conj {})
{}
user=> (conj [])
[]
`
不符合预期,但通过建议的补丁修改的示例
`
user=> (assoc {})
ArityException 错误的参数数量传递给:core/assoc clojure.lang.AFn.throwArity (AFn.java:429)
user=> (assoc! (transient {}))
ArityException 错误的参数数量传递给:core/assoc! clojure.lang.AFn.throwArity (AFn.java:429)
user=> (dissoc! (transient {}))
ArityException 错误的参数数量传递给:core/dissoc! clojure.lang.AFn.throwArity (AFn.java:429)
;; 补丁使 conj! 聚合多个参数,类似于 conj
user=> (conj! (transient []) 1 2 3)
ArityException 错误的参数数量传递给:core/conj! clojure.lang.AFn.throwArity (AFn.java:429)
;; 补丁会为缺少最后一个键的值报错,不会静默地使用 nil 作为最后一个值
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 仅当取一个 coll 作为参数时产生错误,而 disj 在这种情况下可以工作的讨论
https://groups.google.com/forum/?fromgroups=#!topic/clojure/Z9mFxsTYTqQ
审核: Alex Miller