请分享您的观点在 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)

;; 补丁启用 conj! 支持多个参数,如 conj
user=> (conj! (transient []) 1 2 3)
ArityException 传递给:core/conj! 参数数错误(4)clojure.lang.AFn.throwArity (AFn.java:429)

;; 补丁会对 assoc! 缺少的最后一个键值报错,而不是静默使用 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
by

评论由:jafingerhut 发布

文件 clj-1103-make-conj-assoc-dissoc-handle-args-similarly-v1.txt 日期为 2012 年 11 月 4 日,将 conj、conj!、assoc、assoc! 和 dissoc、dissoc!的处理参数相似。

0
by

评论由:bbloom 发布

我也遇到过这个问题,并在以下论坛开始了额外的讨论: https://groups.google.com/d/topic/clojure-dev/wL5hllfhw4M/discussion

特别是,我不认同 "(into coll xs)" 足够这个观点,因为 into 暗示着 conj,并且没有简洁而符合规范的 (into map (parition 2 keyvals)) 编写方式

所以我投了 +1

0
by

评论由:jafingerhut 发布

修复程序 clj-1103-2.diff 与之前的修复程序 clj-1103-make-conj-assoc-dissoc-handle-args-similarly-v1.txt 相同,但它可以干净地应用到最新版的主分支。唯一的变化是在测试文件中的某些上下文行有些更改。

0
by

评论由:jafingerhut 发布

修复程序 clj-1103-3.diff 与 clj-1103-2.diff 相同,除了一些上下文的 patch 中对 assoc(image: 和 dissoc) 的 doc 字符串的更改。

0
by

评论由:jafingerhut 发布

修复程序 clj-1103-4.diff 与之前的 clj-1103-3.diff 相同,除了一些上下文行更新,以便今天可以干净地应用到最新的 Clojure 主分支。

0
by

评论由:alexmiller 发布

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

0

评论由:bbloom 发布

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

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

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

对于瞬态版本也是类似的。

如果有一天您尝试这样做(应用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

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

0

评论者:michaelblume

更新补丁

0

评论由:jafingerhut 发布

是否是有意遗漏了在早期版本中包含的 assoc! 的更改?如果是这样,我可以创建另一个更新版本 — 只是好奇这次更改的原因。

0

评论者:michaelblume

这绝不是故意的,感谢您指出这个问题,我很诚实地不知道为什么在我的这一端出现了这种情况。我认为这个补丁应该是一个正确的更新。为此表示歉意。

0

评论由:jafingerhut 发布

不用担心,并感谢您保持补丁的最新状态,即使它还留有我的名字。

...