正常工作示例
`
Clojure 1.7.0-master-SNAPSHOT
user=> (dissoc {})
{}
user=> (disj #{})
{}
user=> (conj {})
{}
user=> (conj [])
[]
`
未按预期工作但由提议的补丁更改的示例
`
user=> (assoc {})
ArityException 错误参数数量 (1) 传递给:core/assoc clojure.lang.AFn.throwArity (AFn.java:429)
user=> (assoc! (transient {}))
ArityException 错误参数数量 (1) 传递给:core/assoc! clojure.lang.AFn.throwArity (AFn.java:429)
user=> (dissoc! (transient {}))
ArityException 错误参数数量 (1) 传递给:core/dissoc! clojure.lang.AFn.throwArity (AFn.java:429)
;; 补丁使得 conj! 可以接受多个参数,就像 conj 一样
user=> (conj! (transient []) 1 2 3)
ArityException 错误参数数量 (4) 传递给:core/conj! clojure.lang.AFn.throwArity (AFn.java:429)
;; 补丁会对缺少 key 的值使用错误,而不是静默地使用 nil 作为最后一个值
user=> (assoc! (transient {}) 1 2 3)
对象[clojure.lang.PersistentArrayMap$TransientArrayMap 0x2e7569b8 "clojure.lang.PersistentArrayMap$TransientArrayMap@2e7569b8"]
`
我在代码中查找了其他类似的案例,并发现它们在处理不同数量的参数方面存在一些差异,例如
- conj 可以处理任意数量的参数,但 conj! 不能。
- assoc 会检查有无指定值的最后一个 key (CLJ-1052),但 assoc! 不会。
历史/讨论:关于 conj 在只以一个集合作为参数时引发错误的问题在 Clojure Google 群组中进行了讨论,而 disj 在这种情况下却能正常运行
https://groups.google.com/forum/?fromgroups=#!topic/clojure/Z9mFxsTYTqQ
审查人: Alex Miller