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)

对象[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 相同,除了它可以干净地应用到最新的 master。唯一的变化是补丁中的上下文行中的一些关于 assoc(image: 和 dissoc) 的文档字符串。

0

评论者:jafingerhut

补丁 clj-1103-4.diff 与以前相同的 clj-1103-3.diff,除了它更新了一些上下文行,以便在没有错误的情况下应用到最新的 Clojure master。

0

评论由:alexmiller做出

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

0

评论由:bbloom做出

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

这些当前工作正常
(dissoc {})
(disj #{})

以下在一些情况下会失败,因为它们的元数错误
(assoc {})
(conj {})

类似地,对于转置版本。

如果你曾经尝试过执行(应用assoc m keyvals)... 初看起来似乎可行,但有一天突然,嘭!因为尝试对一个空序列的keyvals进行了处理而导致运行时错误。

0

评论者:jafingerhut

2014年8月6日的补丁clj-1103-5.diff,今天对最新的Clojure master版本进行了干净的应用,而之前的补丁则不行。Rich向1.7.0-alpha1添加了conj的1个参数版本,因此该更改不再包含在此补丁中。

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

不必担心,感谢你保持这个补丁的更新,即使我的名字还保留在上面。

...