2024 年 Clojure 状况调查 中分享您的想法!

欢迎!有关该系统如何工作的更多信息,请参阅 关于 页面。

0
Clojure

PersistentQueue 实现 Sequential 接口,但没有实现 java.util.List。列表和 Sequential 都是等价类。这意味着您可能会遇到非传递性相等。

(def q (conj clojure.lang.PersistentQueue/EMPTY 1 2 3)) ;=> #user/q (def al (doto (java.util.ArrayList.) (.add 1) (.add 2) (.add 3))) ;=> #user/al (def v [1 2 3]) ;=> #user/v (= al v) ;=> true (= v q) ;=> true (not= al q) ;=> true

这是因为 PersistentQueue 是 Sequential,但不是 List,ArrayList 是 List,但不是 Sequential,而 PersistentVector 两者都是。

19 答案

0

评论由:ppotter 提出

哎呀,根据 http://dev.clojure.org/display/design/JIRA workflow,我应该在使用 JIRA 之前先给 clojure-dev 发邮件。以下是讨论内容

https://groups.google.com/d/topic/clojure-dev/ME3-Ke-RbNk/discussion

0

评论由:ppotter 提出

附加:001-make-PersistentQueue-implement-List.diff,2012年9月15日

请注意,此补丁与 CLJ-1070 中我添加的补丁存在一些冲突,因为它们都向 PersistentQueue 添加了额外的接口 - 在此情况下为 List,在 CLJ-1070 中为 IHashEq。

0

评论由:[email protected] 提供

菲利普,补丁看起来相当不错——感谢你完成这项工作。几点注意事项

这仅代表我个人观点,但我不太喜欢在 Java 文件顶部使用通配符来列出导入,即使意味着多出几行。

我发现“List stuff”代码与 ASeq 和 EmptyList 中的内容一致。我想这是由于 EmptyList 和 PersistentQueue 扩展了 Obj,因此不能扩展 ASeq,所以才会复制。这是唯一原因吗?重复这些方法定义似乎有点遗憾,但你有没有更好的解决方案呢?

如果你也能测试你实现的几个 List 方法,那就更好了。

0

评论由:[email protected] 提供

哦,还有,“git am”拒绝应用补丁,但我不确定为什么。“patch -p 1”却完美地工作。

0

评论由:ppotter 提出

你在使用 git am 时使用了 --keep-cr 选项吗?

我犹豫是否应该在行尾添加 CR,因为我编辑的文件在这一点上并不一致。如果你在 emacs 中打开它们,大约有一半的行以 ^M 结尾。

0

评论由:ppotter 提出

我将提交另一个补丁,将导入修改。我会思考列表实现,看看我能想出什么办法。

0

评论由:ppotter 提出

附上 002-make-PersistentQueue-implement-Asequential.diff

此补丁是替代 001-make-PersistentQueue-implement-List.diff 的方案

所以我采纳了你关于 ASeq 的建议,但感觉直接让 PersistentQueue 实现 ISeq 似乎不太合适。

所以我将 ASeq 分成两部分——ASequential,它实现了 j.u.{Collection,List} 并管理 List-equality 和 hashcodes;以及 ASeq,实际上……坦白说,似乎已经不再做了。

作为额外的好处,这个补丁还解决了 CLJ-1070,所以我添加了该签中的测试来证明这一点。此补丁还通过删除所有 equals/hashCode 东西和所有 Collection 东西来整理 PersistentQueue。

(结果是,由于 ASeq 已经实现了 Obj,PersistentQueue 实现 Obj 的实际上并没有构成障碍。)

希望得到关于这种方法的评论,以及它与这里的前一个补丁和 CLJ-1070 上的补丁有何不同。

0
by

评论由:ppotter 提出

查看EmptyList实现List的方法,它与其他方法是重复的,但不应如此。我认为其indexOf的实现是最大的罪魁祸首——它应该仅仅是'return -1;',但它有一个庞大无比的for循环!但这个问题超出了这个工单的范围,因此我不会在这里修复它。

0
by

评论由:jafingerhut发表

Philip,由于CLJ-1070的补丁已应用,这些补丁不再适用。您愿意更新它们吗?如果是这样,请删除已过时的补丁。

0
by

评论由:ppotter 提出

Andy,非常感谢您让人们关注这些事情。我确实会提交新的补丁,希望这个周末。

0
by

评论由:ppotter 提出

用新的能干净地应用于master的补丁替换了现有的补丁。

有两个补丁

001-clj-1059-make-persistentqueue-implement-list.diff

这个补丁通过让PersistentQueue直接实现List来修复了等价性。我还趁机移除了通配符导入,并添加了对List方法的测试,与之前的补丁版本相比。

002-clj-1059-asequential.diff

这个补丁通过创建一个新的抽象类ASequential,并让PersistentQueue继承这个类来修复等价性。

我仍然更喜欢ASequential补丁,但我将这两个都留在这里进行比较。

0
by

评论由:halgari发表

审查中。

0
by

评论由:jafingerhut发表

菲利普,我认为这次是你的补丁002-clj-1059-asequential.diff与CLJ-1000提交的补丁冲突了,导致无法正常应用。我通常修复那些改动简单、机械的过时补丁,但这次你移动了一些CLJ-1000的补丁更改了实现的方法,因此最好有人找出一种更新此补丁的方法,而不会破坏CLJ-1000的更改。

0

评论由:ppotter 提出

感谢安迪。已提交新补丁,002-clj-1059-asequential-rebased-to-cached-hasheq.diff,取代了002-clj-1059-asequential.diff。

补丁001-clj-1059-make-persistentqueue-implement-list.diff仍然可以正常应用,并且是002-clj-1059-asequential-rebased-to-cached-hasheq.diff的替代方案。

0

评论由:jafingerhut发表

由于2014年1月30日前一周对Clojure主分支的提交,特别是对hasheq的更改,补丁002-clj-1059-asequential-rebased-to-cached-hasheq.diff不再可以正常应用。

001-clj-1059-make-persistentqueue-implement-list.diff仍然可以。

...