请在 2024 年 Clojure 调查!分享一下您的想法。

欢迎!请访问关于页面以获取更多关于如何使用本站的信息。

+8
Collections

如期工作示例

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

{}

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

不按预期工作但由提议的补丁改变的示例

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

;; 补丁允许 conj! 采用与 conj 相同的多参数形式
user=> (conj! (transient []) 1 2 3)
ArityException 错误的参数数量(4)传递给:core/conj! 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

特别是,我不认同“(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 {})

对于瞬态版本也是如此。

如果您曾尝试这样做(apply assoc m keyvals),这在表面上看起来没问题,但某天,砰!运行时错误,因为您给了一个空的序列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

这绝非故意行为,感谢你指出来,我 honestly 真的不知道为什么会发生这种情况。我认为这个补丁应该是一个正确的更新。为此我表示歉意。

0
作者:

评论由:jafingerhut 提供

没关系,感谢你保持补丁的更新状态,即使补丁名称上是我的名字。

...