请在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, 15/Sep/12

请注意,此补丁与我为CLJ-1070添加的补丁有轻微冲突,因为它们都为PersistentQueue添加了额外的接口 - 在这种情况下是List,CLJ-1070是IHashEq。

0

评论由: [email protected]

菲利普,补丁看起来相当不错 - 谢谢你做这件事。几点注意

这只是一些个人看法,但即使这意味着在 .java 文件顶部多几行,我还是希望导入列表时不使用通配符。

我注意到“列出项目”的代码是 ASeq 和 EmptyList 中的代码的一个副本。我认为这是因为 EmptyList 和 PersistentQueue 扩展了 Obj,因此不能扩展 ASeq。这是唯一的原因吗?重复这些方法定义似乎有些可惜,但我不确定有什么更好的解决方案,你知道吗?

如果测试确保实现了几个列表方法,那就更好了。

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} 并管理列表相等性和哈希码;以及 ASeq,老实说,它似乎已经没有什么用了。

此外,这个补丁还解决了 CLJ-1070 问题,因此我添加了该票证的测试以证明这一点。它还对 PersistentQueue 进行了整理,移除了所有 equals/hashcCode 东西以及所有 Collection 东西。

(结果发现,由于 ASeq 已经实现了 Obj,PersistentQueue 实现 Obj 并不是使用它的障碍。)

我希望您对这个方法提供意见,并说明它与这里的上一个补丁和 CLJ-1070 的补丁有何不同。

0

评论由: ppotter

观察EmptyList对List的实现,其他实现都是重复的,但实际上它不应该这样。我认为它的indexOf实现在此是罪魁祸首——它应该仅仅返回'-1',但它有一个非常大的for循环!但这已经超出了这个问题的范围,因此我不会在这里修复它。

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
by

评论人:jafingerhut

菲利普,我认为这次是因为您提交给 CLJ-1000 的补丁,导致您的 patch 002-clj-1059-asequential.diff 无法干净地应用。我经常修复那些改动简单且机械的旧补丁,但在这个情况下,您更改了一些 CLJ-1000 的补丁已经修改实现的方法,因此最好有人找出一种方法来更新这个补丁,而不会破坏 CLJ-1000 的改动。

0
by

评论由: 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
by

评论人:jafingerhut

由于在 2014 年 1 月 30 日前的几周内向 Clojure master 提交了补丁,特别是对 hasheq 的更改,补丁002-clj-1059-asequential-rebased-to-cached-hasheq.diff不再可以干净地应用。

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

...