2024 年 Clojure 调查!中分享您的想法。

欢迎!请参阅 关于 页面了解更多关于这个网站如何工作的小信息。

+8
Collections

工作正常的示例

`
Clojure 1.7.0-master-SNAPSHOT
user=> (dissoc {})
{}
user=> (disj #{})

{}

user=> (conj {})
{}
user=> (conj [])
[]
`

不符合预期的示例,但会被提议的补丁修改

`
user=> (assoc {})
ArityException 参数错误:传递给:core/assoc clojure.lang.AFn.throwArity (AFn.java:429)
user=> (assoc! (transient {}))
ArityException 参数错误:传递给:core/assoc! clojure.lang.AFn.throwArity (AFn.java:429)
user=> (dissoc! (transient {}))
ArityException 参数错误:传递给:core/dissoc! clojure.lang.AFn.throwArity (AFn.java:429)

;; 补丁启用 conj! 以多参数方式工作,如 conj
user=> (conj! (transient []) 1 2 3)
ArityException 参数错误:传递给:core/conj! clojure.lang.AFn.throwArity (AFn.java:429)

;; 补丁将在 assoc! 中为缺失的最后一个 key 报错,而不是静默地使用 nil 作为最后一个 value
user=> (assoc! (transient {}) 1 2 3)

object[clojure.lang.PersistentArrayMap$TransientArrayMap 0x2e7569b8 "clojure.lang.PersistentArrayMap$TransientArrayMap@2e7569b8"]

`

我在代码的其他部分查找了类似案例,发现它们在处理不同数量参数的情况下有一些差异,例如

  • conj 可以处理任意数量的参数,但 conj! 则不能。
  • assoc 检查是否有未指定值的最后一个 key(CLJ-1052),但 assoc! 则没有。

历史/讨论:Clojure Google 群组中有一场关于 conj 只接受集合作为参数时引发错误,而 disj 对此情况可以正常工作时的讨论

https://groups.google.com/forum/?fromgroups=#!topic/clojure/Z9mFxsTYTqQ

筛选者: Alex Miller

16 答案

0
参考:https://clojure.atlassian.net/browse/CLJ-1103(由jafingerhut报告)
...