按预期工作的示例
`
Clojure 1.7.0-master-SNAPSHOT
user=> (dissoc {})
{}
user=> (disj #{})
{}
user=> (conj {})
{}
user=> (conj [])
[]
`
按预期不工作,但由拟议补丁更改的示例
`
user=> (assoc {})
ArityException Passed错误的参数数(1)到:core/assoc clojure.lang.AFn.throwArity (AFn.java:429)
user=> (assoc! (transient {}))
ArityException Passed错误的参数数(1)到:core/assoc! clojure.lang.AFn.throwArity (AFn.java:429)
user=> (dissoc! (transient {}))
ArityException Passed错误的参数数(1)到:core/dissoc! clojure.lang.AFn.throwArity (AFn.java:429)
;; 补丁允许conj!使用多个参数,如conj
user=> (conj! (transient []) 1 2 3)
ArityException Passed错误的参数数(4)到:core/conj! clojure.lang.AFn.throwArity (AFn.java:429)
;; 补丁将(Result)会为assoc!缺少最后一个键的值而报错,而不是静默地使用nil作为最后一个值
user=> (assoc! (transient {}) 1 2 3)
object[clojure.lang.PersistentArrayMap$TransientArrayMap 0x2e7569b8 "clojure.lang.PersistentArrayMap$TransientArrayMap@2e7569b8"]
`
我在代码的其余部分中查找了类似的情况,发现它们在如何处理不同数量的参数方面有一些其他差异,例如
- conj可以处理任意数量的参数,但conj!不行。
- assoc会检查没有指定值的最后一个键(CLJ-1052),但assoc!不会。
历史/讨论:关于conj在有只有一个参数时给出错误时,在Clojure Google群组中出现了讨论,而disj在这种情况下可以工作
https://groups.google.com/forum/?fromgroups=#!topic/clojure/Z9mFxsTYTqQ
筛选: Alex Miller