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)

;; 补丁会在缺少关联值时报错,而不是默默地使用 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 (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。唯一的变化是在补丁的上下文中修改了一些关联(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)...,这看起来似乎可以工作,但有一天,嘭!运行时错误,因为你尝试给它一个空的关键值序列。

0

评论者:jafingerhut

2014年8月6日的补丁clj-1103-5.diff可以轻松应用于今天的最新Clojure主版本,而之前的补丁则不行。Rich为1.7.0-alpha1添加了1参数版本的conj,所以这个更改不再包含在这个补丁中。

0

评论者:jafingerhut

2014年8月29日的补丁clj-1103-6.diff与之前的补丁clj-1103-5.diff(将被删除)相同,但可以轻松应用于最新的Clojure主版本。

0

评论者:jafingerhut

2015年5月25日的补丁clj-1103-7.diff与前一个补丁clj-1103-6.diff(将被删除)相同,但它可以轻松应用于最新的Clojure主版本。

0

评论者:michaelblume

更新补丁以应用于主版本

0

评论者:michaelblume

更新补丁

0

评论者:jafingerhut

clj-1103-9.patch故意不包含之前补丁中的assoc!更改吗?如果是这样,我可以再创建一个新的更新版——只是好奇是否有修改的原因。

0

评论者:michaelblume

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

0

评论者:jafingerhut

不必担心,我感谢您保持补丁的更新,即使在保持我的名字的情况下。

...