按预期工作示例
`
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