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

欢迎!有关如何使用本网站的更多信息,请参阅 关于 页面。

+8
集合

正常工作的示例

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

{}

用户=> (conj {})
{}
用户=> (conj [])
[]
`

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

`
用户=> (assoc {})
ArityException 错误的数量:传递给 core/assoc 的参数个数 (1)
用户=> (assoc! (transient {}))
ArityException 错误的数量:传递给 core/assoc! 的参数个数 (1)
用户=> (dissoc! (transient {}))
ArityException 错误的数量:传递给 core/dissoc! 的参数个数 (1)

;; 补丁启用 conj! 以支持多个参数,类似于 conj
用户=> (conj! (transient []) 1 2 3)
ArityException 错误的数量:传递给 core/conj! 的参数个数 (4)

;; 对于缺少最后一个键的值,补丁将报错,而不是默默地使用 nil 作为最后一个值
用户=> (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

特别是,我觉得“into”并不是足够充分的论据,因为“into”意味着“conj”,而没有一个简洁且符合惯例的方式来编写“(into map (partition 2 keyvals))”。

所以赞同+1

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)操作,这会让人感到烦恼……一开始看起来没问题,但后来某一天,突然!因为您尝试提供一个空的keyvals序列,程序出错。

0
by

评论人:jafingerhut

截止到今天,patch clj-1103-5.diff(2014年8月6日发布)可以干净地应用于最新的Clojure master版本,而之前的补丁则不行。Rich在1.7.0-alpha1版本中添加了1个参数版本的conj,因此这个更改不再包含在本次补丁中。

0
by

评论人:jafingerhut

patch clj-1103-6.diff(2014年8月29日发布)与之前的patch clj-1103-5.diff相同(将被删除),但可以干净地应用于最新的Clojure master版本。

0
by

评论人:jafingerhut

patch clj-1103-7.diff(2015年5月25日发布)与之前的patch clj-1103-6.diff相同(将被删除),但可以干净地应用于最新的Clojure master版本。

0
by

评论者:michaelblume

更新了补丁,以便可以干净地应用到master版本

0
by

评论者:michaelblume

更新了补丁

0
by item “name”>jira< / span>

评论人:jafingerhut

clj-1103-9.patch版本中省略了之前补丁中包含的assoc!更改是故意的吗?如果是这样,我可以创建另一个更新的版本 —— 只是想了解一下进行更改的原因。

0

评论者:michaelblume

这绝非本意所出,感谢您的指出,我确实不清楚为何出现这种情况。我认为这个补丁应该是一个正确的更新。对此表示歉意。

0

评论人:jafingerhut

不用担心,感谢您保持补丁的最新状态,即便补丁上仍然有我的名字。

...