2024 年 Clojure 状态调查!分享您的想法。

欢迎!请参阅关于页面以获取更多有关这个作品的信息。

+8
集合

符合预期的工作示例

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

;; patch enables conj! with multiple arguments, like conj
user=> (conj! (transient []) 1 2 3)
ArityException 传给:core/conj! 的参数数量错误(4) clojure.lang.AFn.throwArity (AFn.java:429)

;; patch would give error for missing value for last key to assoc!, not silently use nil for last value
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

Screened by: 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相同,除了更新了一些上下文行,以便它能够_today_干净地应用到最新的Clojure master分支。

0

评论由:alexmiller 发布

有人能更新一下描述,并附上一个代码示例吗?或者至少在这里给出也行?

0

评论由:bbloom 发布

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

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

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

对于临时的!版本,情况相同。

如果您曾经尝试过(apply assoc m keyvals)...那么它看起来工作正常,但后来有一天,砰!运行时错误,因为您尝试向它提供一个空的keyvals序列。

0

评论者:jafingerhut

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

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

更新补丁以适用于主版本

0

评论者:michaelblume

已更新补丁

0

评论者:jafingerhut

clj-1103-9.patch是否有意省略了早期补丁中包含的assoc!更改?如果这样,我可以创建另一个更新的补丁——只是好奇是否有原因做出这样的更改。

0

评论者:michaelblume

这完全不是故意的,感谢你指出这一点,我真心不知道导致这种情况在我的端发生了什么。我认为这个补丁应该是正确的更新。对此表示歉意。

0

评论者:jafingerhut

不用在意,我感谢你在保持补丁更新的同时,仍然保留了我在补丁上的名字。

...