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

欢迎!请参阅关于页面了解更多关于如何使用本网站的信息。

+8
Collections

如预期工作的示例

`
Clojure 1.7.0-master-SNAPSHOT
用户=> (dissoc {})
{}
用户=> (disj #{})

{}

用户=> (conj {})
{}
用户=> (conj [])
[]
`

没有按预期工作,但经过提议的补丁已更改的示例

`
用户=> (assoc {})
ArityException 传递给:core/assoc 的参数数量错误(1)clojure.lang.AFn.throwArity (AFn.java:429)
用户=> (assoc! (transient {}))
ArityException 传递给:core/assoc! 的参数数量错误(1)clojure.lang.AFn.throwArity (AFn.java:429)
用户=> (dissoc! (transient {}))
ArityException 传递给:core/dissoc! 的参数数量错误(1)clojure.lang.AFn.throwArity (AFn.java:429)

;; patch enables conj! with multiple arguments, like conj
用户=> (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
用户=> (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,而且没有简洁和符合 Clojure 风格的方式来编写 (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)......它最初看起来工作正常,但后来有一天,砰!运行时错误,因为您尝试给它一个空的keyvals列表。

0

由:jafingerhut 发表的评论

补丁文件clj-1103-5.diff,日期为2014年8月6日,可干净地应用到今天为止最新版本的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

更新补丁以应用到master版本

0

评论者:michaelblume

更新补丁

0

由:jafingerhut 发表的评论

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

0

评论者:michaelblume

这绝非故意为之,感谢您指出这一点。我 honest 地不确定我的端发生了什么导致这种情况。我认为这个补丁应该是一个正确的更新。对此表示歉意。

0

由:jafingerhut 发表的评论

不必担心,感谢您保持补丁最新,即使名称上是我的名字。

...