正常工作的示例
`
Clojure 1.7.0-master-SNAPSHOT
用户=> (dissoc {})
{}
用户=> (disj #{})
{}
用户=> (conj {})
{}
用户=> (conj [])
[]
`
不按预期工作,但由提议的补丁改变的示例
`
用户=> (assoc {})
ArityException 错误的数量:传递给 core/assoc 的参数个数 (1)
用户=> (assoc! (transient {}))
ArityException 错误的数量:传递给 core/assoc! 的参数个数 (1)
用户=> (dissoc! (transient {}))
ArityException 错误的数量:传递给 core/dissoc! 的参数个数 (1)
;; 补丁启用 conj! 以支持多个参数,类似于 conj
用户=> (conj! (transient []) 1 2 3)
ArityException 错误的数量:传递给 core/conj! 的参数个数 (4)
;; 对于缺少最后一个键的值,补丁将报错,而不是默默地使用 nil 作为最后一个值
用户=> (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 相比,disj 可以处理此情况)的讨论
https://groups.google.com/forum/?fromgroups=#!topic/clojure/Z9mFxsTYTqQ
筛选者: Alex Miller