请在 2024 年 Clojure 调查问卷 中分享您的想法!

欢迎!请参阅 关于 页面以了解更多有关这个工作原理的信息。

+8
Collections

按预期工作示例

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

{}

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

未按预期工作示例,但通过提议的补丁进行了更改

`
user=> (assoc {})
ArityException 传递给:core/assoc 的参数数不正确(1)。
user=> (assoc! (transient {}))
ArityException 传递给:core/assoc! 的参数数不正确(1)。
user=> (dissoc! (transient {}))
ArityException 传递给:core/dissoc! 的参数数不正确(1)。

;; 补丁启用 conj!,允许多个参数,类似于 conj
user=> (conj! (transient []) 1 2 3)
ArityException 传递给:core/conj! 的参数数不正确(4)。

;; 补丁会为关联!缺失的最后一个键的值报错,而不是静默地使用 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 在只接受一个 coll 作为参数时抛出错误时出现了一次讨论,与 disj 相反,对于这种情况 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版本上。唯一的变化是在补丁的上下文中对assoc(image: 和 dissoc)的一些文档字符串进行了更改。

0

评论人:jafingerhut

补丁clj-1103-4.diff与上一个clj-1103-3.diff相同,但它更新了一些上下文行,以便它可以干净地应用到今天的最新Clojure master版本上。

0

评论由:alexmiller

有人能更新描述,添加一些代码示例吗?或者至少在这里放下它们?

0

评论由:bbloom

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

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

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

同样对于transient版本的这些操作。

如果在尝试做(应用assoc m keyvals)时感到烦恼,那么这种情况可能会出现。一开始似乎奏效,但后来某天,哎呀!运行时错误,因为您尝试给它一个空的键值序列。

0

评论人:jafingerhut

于2014年8月6日编制的补丁clj-1103-5.diff_today最新版Clojure master上无错误地应用,而之前的补丁则没有。Rich在1.7.0-alpha1中增加了1个参数版本的conj,因此该变更不再包含在此补丁中。

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

无需担心,我感谢您保持补丁的最新状态,即使在补丁上署我的名字。

...