2024 Clojure 状态调查!中分享你的想法。

欢迎!请参阅关于 页面了解该功能的相关信息。

+8
提问 集合 分类下,提问者:

按预期工作示例

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

{}

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

按预期未工作,但 durch der vorgeschlagenen Patches geändert

`
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 在仅传递一个 coll 作为参数时给出错误,而 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 相同,但除了将一些上下文中的文档字符串(关于 assoc(image: 和 dissoc)更新了,以确保它可以干净地应用到最新的 master 版本。

0

由 jafingerhut 添加的评论:

补丁文件 clj-1103-4.diff 与之前的 clj-1103-3.diff 相同,但更新了上下文行,以便今天可以将其干净地应用到最新的 Clojure master 版本中。

0

由 alexmiller 添加的评论:

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

0
by

由 bbloom 添加的评论:

你是指代码示例是什么意思?

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

以下因为在参数数量上出错而失败
(assoc {})
(conj {})

对于临时版本也是类似的情况。

如果你尝试执行 (apply assoc m keyvals)... 它最初看起来是正确的,但后来有一天,砰!运行时错误,因为你想给它一个空序列的键值。

0
by

由 jafingerhut 添加的评论:

2014年8月6日发布的补丁clj-1103-5.diff干净地应用到了最新的Clojure master版本,而之前的补丁不行。Rich在1.7.0-alpha1中添加了conj函数的单参数版本,所以这个改动不再包含在这个补丁中。

0
by

由 jafingerhut 添加的评论:

2014年8月29日发布的补丁clj-1103-6.diff与前一个补丁clj-1103-5.diff相同(将被删除),但适用于最新的Clojure master版本。

0
by

由 jafingerhut 添加的评论:

2015年5月25日发布的补丁clj-1103-7.diff与前一个补丁clj-1103-6.diff相同(将被删除),但适用于最新的Clojure master版本。

0
by

评论者为:michaelblume

更新了补丁以便干净地应用到主分支

0
by

评论者为:michaelblume

更新了补丁

0

由 jafingerhut 添加的评论:

clj-1103-9.patch 是否有意遗漏了在早期补丁中更改的 assoc!?如果这样,我可以创建另一个更新的版本。我只是想知道是否有什么原因导致这种更改。

0

评论者为:michaelblume

这绝非有意为之,感谢你的提醒,我诚实地说不清楚是什么原因导致了这种情况。我认为这个补丁应该是正确的更新。对此表示歉意。

0

由 jafingerhut 添加的评论:

别担心,我感谢你保持补丁的更新,即使它仍然带着我的名字。

...