请在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)

;; 补丁会为缺少最后一个键的值报错,不会静默地使用 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 仅当取一个 coll 作为参数时产生错误,而 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"意味着合并,并没有一种简洁且符合规范的写法来书写"(into map (parition 2 keyvals))"

所以我支持+1

0

评论由:jafingerhut 提出

补丁文件clj-1103-2.diff与上一版补丁文件clj-1103-make-conj-assoc-dissoc-handle-args-similarly-v1.txt相同,除了它可以应用到最新主分支上。唯一的更改是测试文件中的一些上下文行有所更改。

0

评论由:jafingerhut 提出

补丁文件clj-1103-3.diff与补丁文件clj-1103-2.diff相同,除了它可以应用到最新主分支上。唯一的更改是补丁文件中关于assoc(image:和dissoc)的文本文档。

0

评论由:jafingerhut 提出

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

0

评论由:alexmiller发表

有人能更新描述并提供一些代码示例吗?或者至少在这里放下它们?

0

评论由:bbloom发表

你想说什么代码示例?

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

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

类似的情况也适用于transient !版本。

如果你曾经尝试过(应用关联m键值)...最初看起来工作正常,但有一天,砰!由于你尝试给它一个空的键值序列,因此出现了运行时错误。

0

评论由:jafingerhut 提出

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

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
by

由:michaelblume 发布的评论

这绝对不是故意的,感谢您指出这一点,我老实地说,我不太清楚我这边发生了什么才会导致这种情况。我认为这个补丁应该是一个正确的更新。为此事道歉。

0
by

评论由:jafingerhut 提出

不用担心,谢谢您让补丁保持最新,即使在保持我的名字的情况下。

...