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)

;; 补丁会在缺失最后一个键值时报错,而不是静默地使用 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](https://groups.google.com/d/topic/clojure-dev/wL5hllfhw4M/discussion)

特别是,我不认为 (into coll xs) 是足够的,因为 into 意味着 conj,而没有一个简练且符合习惯的方式来写 (into map (parition 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 相同,except it updates some context lines so that it applies cleanly to latest Clojure master as of today.

0 投票

评论由:alexmiller 提出。

能否有人用一些代码示例来更新描述?或者至少在这里放下它们?

0 投票

评论由:bbloom 提出。

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

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

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

对于瞬态版本的情况也类似。

如果您尝试过(应用 assoc m keyvals),这会让人感到烦恼……它最初看起来是可行的,但有一天,突然!由于您尝试给它一个空的 keyvals 序列,它将引发运行时错误。

0 投票

评论者:jafingerhut

补丁 clj-1103-5.diff 日期为 2014 年 8 月 6 日,今天已成功应用到最新的 Clojure master,而之前的补丁并没有做到这一点。Rich 在 1.7.0-alpha1 中添加了 conj 的 1 个参数版本,因此该更改不再包含在本补丁中。

0 投票

评论者:jafingerhut

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

0 投票

评论者:jafingerhut

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

0 投票

由:michaelblume 发表的评论

更新补丁,使其能够成功应用到主版本

0 投票

由:michaelblume 发表的评论

更新补丁

0 投票

评论者:jafingerhut

clj-1103-9.patch 是否有意省略了之前补丁中包含的 assoc! 变更?如果是,我可以创建另一个带更新的版本——我只是好奇是否有改变原因。

0 投票

由:michaelblume 发表的评论

这绝不是故意的,感谢你指出,我其实并不确定是我这边出了什么问题导致了这种情况。我认为这个补丁应该是一个正确的更新。为此感到抱歉。

0 投票

评论者:jafingerhut

没关系,感谢你保持补丁最新,即使它仍然显示的是我的名字。

...