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 作为最后一个值
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。唯一的变化是在补丁的上下文中对 assoc(image:) 和 dissoc 的某些文档字符串进行了更改。

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
by

评论由:jafingerhut

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

0
by

评论由:jafingerhut

补丁 clj-1103-6.diff 日期为 2014 年 8 月 29 日与之前的补丁 clj-1103-5.diff 相同(将被删除),不同之处在于它可以干净地应用于最新的 Clojure master。

0
by

评论由:jafingerhut

补丁 clj-1103-7.diff 日期为 2015 年 5 月 25 日与之前的补丁 clj-1103-6.diff 相同(将被删除),不同之处在于它可以干净地应用于最新的 Clojure master。

0
by

评论者:michaelblume

更新补丁以干净地应用于 master

0
by

评论者:michaelblume

更新补丁

0
by

评论由:jafingerhut

clj-1103-9.patch 为什么要省略之前补丁中包含的对 assoc! 的更改?如果是这样,我可以创建另一个更新版本——只是很好奇为什么会有这样的改变。

0

评论者:michaelblume

这根本不是故意的,谢谢指出,我确实不确定我端发生了什么导致了这种情况。我认为这个补丁应该是一个正确的更新。对此表示歉意。

0

评论由:jafingerhut

不用担心,我也感谢你保持补丁的更新,即使它还在我的名下。

...