分享您的想法,请参与 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,我在提交此工单之前应该给 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]

Philip,补丁看起来相当不错——谢谢为之所做的努力。几点注意:

这只是我的个人观点,但我更喜欢在导入时不使用通配符,即使这意味着在.java文件顶部多出几行。

我注意到“列出东西”的代码是ASeq和EmptyList中内容的复制。我想之所以复制是因为EmptyList和PersistentQueue扩展了Obj,因此不能扩展ASeq。这是唯一的原因吗?似乎重复这些方法定义有点可惜,但我不知道是否有更好的解决方案,你知道吗?

如果测试可以检查你实现的一些List方法,那就更好了。

0
by

评论:[email protected]

哦,顺便说一下,“git am”拒绝应用补丁,但我不确定为什么。“patch -p 1”却完美无误。

0
by

注释由:ppotter 制作

你是否在git am使用了--keep-cr选项?

我很难决定是否应该在行尾添加CR,因为我编辑的文件在这一点上并不一致。如果你在emacs中打开它们,一半的行都会有^M在行尾。

0
by

注释由:ppotter 制作

我将提交另一个补丁,其中导入了更改。我会对列表实现进行思考,并看看我能想出什么办法。

0
by

注释由: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问题,所以我添加了该ticket中的测试来展示这一事实。它还对PersistentQueue进行了整理,移除了所有equals/hashcCode内容和所有Collection内容。

(实际上,由于ASeq已经实现了Obj,PersistentQueue实现Obj的事实并没有构成使用它的障碍。)

欢迎对这种方法的评论,以及它与之前补丁在这里以及CLJ-1070补丁的不同之处。

0

注释由:ppotter 制作

查看EmptyList的List实现,它与其他的重复,但它不应该如此。我认为它的indexOf实现是最大的罪魁祸首 - 它应该只是'return -1;',但它有一个大型的循环!但这些内容已超出了这次补丁的范围,所以我不在这里修复它。

0

评论者:jafingerhut

Philip,现在既然已经应用了CLJ-1070的补丁,这些补丁就不再干净地应用了。你愿意更新它们吗?如果愿意,请删除这些过时的补丁。

0

注释由:ppotter 制作

Andy,非常感谢你努力让人们意识到这些问题。我确实会提交新的补丁,希望在本周晚些时候。

0

注释由:ppotter 制作

用新的补丁替换了现有的补丁,新的补丁可以平稳地应用到master。

有两个补丁

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

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

002-clj-1059-asequential.diff

通过创建一个新的抽象类ASequential,并使PersistentQueue扩展这个类来修复相等性。

我仍然首选ASequential补丁,但我把这两个都留下以供比较。

0

评论者:halgari

审核。

0

评论者:jafingerhut

菲利普,这次我认为是因为提交给 CLJ-1000 的补丁导致您的 002-clj-1059-asequential.diff 补丁未能干净地应用。我经常修复那些更改简单且机械的过时补丁,但在这种情况下,您移动了一些方法,这些方法是 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 master 提交的更改(特别是对 hasheq 的更改),使得 002-clj-1059-asequential-rebased-to-cached-hasheq.diff 补丁不再干净地应用。

001-clj-1059-make-persistentqueue-implement-list.diff 补丁仍然如此。

...