按预期工作示例
`
Clojure 1.7.0-master-SNAPSHOT
user=> (dissoc {})
{}
user=> (disj #{})
{}
user=> (conj {})
{}
user=> (conj [])
[]
`
未按预期工作示例,但通过提议的补丁进行了更改
`
user=> (assoc {})
ArityException 传递给:core/assoc 的参数数不正确(1)。
user=> (assoc! (transient {}))
ArityException 传递给:core/assoc! 的参数数不正确(1)。
user=> (dissoc! (transient {}))
ArityException 传递给:core/dissoc! 的参数数不正确(1)。
;; 补丁启用 conj!,允许多个参数,类似于 conj
user=> (conj! (transient []) 1 2 3)
ArityException 传递给:core/conj! 的参数数不正确(4)。
;; 补丁会为关联!缺失的最后一个键的值报错,而不是静默地使用 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 相反,对于这种情况 disj 可以工作
https://groups.google.com/forum/?fromgroups=#!topic/clojure/Z9mFxsTYTqQ
筛选: Alex Miller