预期的行为示例
`
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 作为最后一个值
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