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

欢迎!请参阅关于页面以获得更多关于这是如何工作的信息。

+8
集合

按预期工作的示例

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

{}

user=> (conj {})
{}
user=> (conj [])
[]
`

按预期不工作,但由拟议补丁更改的示例

`
user=> (assoc {})
ArityException Passed错误的参数数(1)到:core/assoc clojure.lang.AFn.throwArity (AFn.java:429)
user=> (assoc! (transient {}))
ArityException Passed错误的参数数(1)到:core/assoc! clojure.lang.AFn.throwArity (AFn.java:429)
user=> (dissoc! (transient {}))
ArityException Passed错误的参数数(1)到:core/dissoc! clojure.lang.AFn.throwArity (AFn.java:429)

;; 补丁允许conj!使用多个参数,如conj
user=> (conj! (transient []) 1 2 3)
ArityException Passed错误的参数数(4)到:core/conj! clojure.lang.AFn.throwArity (AFn.java:429)

;; 补丁将(Result)会为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!不会。

历史/讨论:关于conj在有只有一个参数时给出错误时,在Clojure Google群组中出现了讨论,而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 #{})

以下由于arity错误失败
(assoc {})
(conj {})

对于瞬态版本也是如此。

如果您曾经尝试过执行(应用 assoc m keyvals)……在最开始它看起来似乎可以工作,但是有一天,哎呀!运行时错误,因为您尝试给它一个空的 keyvals 序列。

0

评论者:jafingerhut

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

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

这绝非有意为之,感谢您指出,我确实不清楚为什么在我这边会出现这种情况。我认为这个补丁应该是一个正确的更新。对此表示歉意。

0

评论者:jafingerhut

不必担心,并且我感谢您保持补丁的同步,即使在这个补丁上保留了姓名。

...