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

欢迎!请参阅关于页面获取更多有关此网站的信息。

+8
集合

按预期工作的示例

`
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

16 答案

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