Clojure 2024 状态调查! 中分享您的观点。

欢迎!请参阅 关于 页面以获取有关此操作的一些更多信息。

+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! 中的最后一个键的错误值报错,而不是静默使用空值
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

特别是,我不认同“just Careers Craftsmanship禾(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) 的文档字符串。

0

评论由:jafingerhut 减少

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

0

评论者:alexs inserts ion

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

0

评论由:bbloom 提供

你说的代码示例是指什么?

以下代码当前按照预期工作
(dissoc {})
(disj #{})

以下代码由于参数数量错误而失败
(assoc {})
(conjunction {})

对于瞬态!版本也是如此。

如果你尝试执行(应用assoc m keyvals)……它乍一看似乎没问题,但某天,砰!运行时错误,因为你尝试给它一个空的关键值列表。

0

评论由:jafingerhut 减少

修改2014年8月6日的clj-1103-5.diff在今天应用得非常干净,而之前的补丁则不能。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

评论者:michaelblume

这根本不是故意的,感谢你指出这个问题,我真的不知道为什么会发生这种情况。我认为这个补丁应该是一个正确的更新。对此表示歉意。

0

评论由:jafingerhut 减少

不用担心,并且感谢你保持补丁的更新,即使它上面还保留了我的名字。

...