2024 年 Clojure 状态调查!中发表您的想法。

欢迎!请参阅关于页面以了解更多关于其工作方式的信息。

+8
Collections

预期工作的示例

`
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)

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

对象 [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](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 版本上可以干净地应用。唯一的变化是在补丁的上下文行中对 assoc(image: 和 dissoc) 的某些 doc 字符串进行了更改。

0

评论由:jafingerhut

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

0

评论由:alexmiller 制作

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

0

评论由:bbloom 制作

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

当前它们按预期工作
(dissoc {})
(disj #{})

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

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

当你尝试执行(应用)(apply assoc m keyvals)时,这会令人烦恼……一开始看起来没问题,但有一天,砰!出现运行时错误,因为你尝试给它一个空的keyvals序列。

0

评论由:jafingerhut

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

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

不用担心,我很感激你保持补丁的最新状态,即使保留了我在其上的名字。

...