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

欢迎!请查阅关于 页面以获取更多关于此功能的信息。

+8
集合

正常工作示例

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

{}

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

未按预期工作但由提议的补丁更改的示例

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

;; 补丁使得 conj! 可以接受多个参数,就像 conj 一样
user=> (conj! (transient []) 1 2 3)
ArityException 错误参数数量 (4) 传递给:core/conj! clojure.lang.AFn.throwArity (AFn.java:429)

;; 补丁会对缺少 key 的值使用错误,而不是静默地使用 nil 作为最后一个值
user=> (assoc! (transient {}) 1 2 3)

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

`

我在代码中查找了其他类似的案例,并发现它们在处理不同数量的参数方面存在一些差异,例如

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

历史/讨论:关于 conj 在只以一个集合作为参数时引发错误的问题在 Clojure Google 群组中进行了讨论,而 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
by

评论由:bbloom 发布

我也遇到了这个问题,并在这里开始了额外的讨论:[链接](https://groups.google.com/d/topic/clojure-dev/wL5hllfhw4M/discussion)

特别是,我不认为(into coll xs)足够,因为into暗示了conj,而且没有简洁而惯用的方式来编写(into map (partition 2 keyvals))

所以我也支持

0
by

评论人:jafingerhut

补丁clj-1103-2.diff与之前的补丁clj-1103-make-conj-assoc-dissoc-handle-args-similarly-v1.txt相同,但可以干净地应用到最新的master分支。唯一的变化是一个测试文件中一些更改的上下文行。

0
by

评论人:jafingerhut

补丁clj-1103-3.diff与补丁clj-1103-2.diff相同,但可以干净地应用到最新的master分支。唯一的变化是在补丁的上下文行中对assoc(image:)和dissoc的某些文档字符串进行了更改。

0
by

评论人:jafingerhut

补丁clj-1103-4.diff与之前的clj-1103-3.diff相同,但更新了一些上下文行,以便它今天可以干净地应用到最新的Clojure master上。

0
by

评论由:alexmiller 发布

有人可以更新描述并提供一些代码示例吗?或者至少在这里有人展示?

0
by

评论由:bbloom 发布

您指的是代码示例吗?

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

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

对于瞬态版本亦是如此。

如果你曾尝试做(apply assoc m keyvals)……一开始看起来工作得很好,但有一天,砰!运行时错误,因为您试图提供一个空的keyvals序列。

0
by

评论人:jafingerhut

2014年8月6日的补丁文件clj-1103-5.diff可干净地应用到今天的最新Clojure主版本,而之前的补丁则不行。Rich在1.7.0-alpha1中添加了conj的1个参数版本,因此该变化不再包含在本补丁中。

0
by

评论人:jafingerhut

2014年8月29日的补丁文件clj-1103-6.diff与之前的补丁clj-1103-5.diff相同(将被删除),但它可以干净地应用到最新的Clojure主版本上。

0
by

评论人:jafingerhut

2015年5月25日的补丁文件clj-1103-7.diff与之前的补丁clj-1103-6.diff相同(将被删除),但它可以干净地应用到最新的Clojure主版本上。

0
by

评论者:michaelblume

更新补丁以应用于master

0
by

评论者:michaelblume

更新补丁

0

评论人:jafingerhut

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

0

评论者:michaelblume

这绝对不是故意的,感谢您的指正。老实说,我不确定是我的哪一方面出了问题导致这种情况发生。我认为这个补丁应该是正确更新的。为此感到很抱歉。

0

评论人:jafingerhut

没关系,我还感谢您保持补丁的最新状态,甚至在我保留名字的情况下。

...