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

欢迎!请参阅关于页面以了解更多有关如何工作的信息。

+8
Collections

按预期正常工作的示例

`
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 作为最后值来处理缺少的最后一个键值对 assoc! 的情况
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

评论由:jafingerhut

clj-1103-make-conj-assoc-dissoc-handle-args-similarly-v1.txt,2012年11月4日,使conj conj! assoc assoc! dissoc dissoc!以相似的频率处理参数。

0

评论由:bbloom

我也遇到了这个问题,并在这里启动了额外的讨论: https://groups.google.com/d/topic/clojure-dev/wL5hllfhw4M/discussion

特别是,我认为(into coll xs)是足够的这种论点并不是我所认同的,因为into隐含了conj,并且没有一种简洁且符合习惯的方法来编写(into map (partition 2 keyvals))

所以我支持

0

评论由:jafingerhut

补丁clj-1103-2.diff与上一个补丁clj-1103-make-conj-assoc-dissoc-handle-args-similarly-v1.txt相同,但它在最新的master版本中也能整洁地应用。唯一的变化是一些测试文件中的上下文行发生了变化。

0

评论由:jafingerhut

补丁clj-1103-3.diff与补丁clj-1103-2.diff相同,除了它在最新的master版本中也能整洁地应用。唯一的变化是在补丁的过程中某些关联docs字符串的变化。

0

评论由:jafingerhut

补丁clj-1103-4.diff与上一份clj-1103-3.diff相同,只不过它更新了一些上下文行,以便今日能整洁地应用于最新的Clojure master版本。

0

评论由:alexmiller

有人可以更新描述并伴随一些代码示例吗?或者至少在这里贴出来?

0

评论由:bbloom

你说的代码实例是什么意思?

这些目前按预期工作
(dissoc {})
(disj #{})

以下因参数错误而失败
(assoc {})
(conj {})

对于暂存版的 ! 参见类似处理。

如果你尝试使用 (apply assoc m keyvals)... 可能会令人烦恼,它一开始看起来工作,但突然有一天,嘣!运行时错误,因为你尝试给它一个空的关键值序列。

0

评论由:jafingerhut

2014年8月6日发布的补丁 clj-1103-5.diff 已经干净地应用到今天的最新 Clojure master 版本上,而之前的补丁则不行。Rich 为 1.7.0-alpha1 添加了 conj 的 1 个参数版本,所以这个变更不再包含在这个补丁中。

0

评论由:jafingerhut

2014年8月29日发布的补丁 clj-1103-6.diff 与之前的补丁 clj-1103-5.diff 相同(将被删除),但是它已经干净地应用到最新的 Clojure master 上。

0

评论由:jafingerhut

2015年5月25日发布的补丁 clj-1103-7.diff 与之前的补丁 clj-1103-6.diff 相同(将被删除),但是它已经干净地应用到最新的 Clojure master 上。

0

评论者:michaelblume

更新补丁以干净地应用到 master 版本

0

评论者:michaelblume

更新补丁

0

评论由:jafingerhut

clj-1103-9.patch是否故意省略了早期补丁中对assoc!的更改?如果是这样,我可以创建一个新的更新版本——只是想了解一下改变的原因。

0

评论者:michaelblume

这绝非故意为之,感谢发现这个问题,我很诚实地说,我不清楚是什么原因导致这种情况发生。我认为这个补丁应该是一个正确的更新。对此表示歉意。

0

评论由:jafingerhut

不必担心,谢谢您保持补丁的更新,同时保持我的名字在上面。

...