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

这是因为它 implement Sequential but not a List,ArrayList is a List but not a 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]

菲利普,补丁看起来很好——谢谢你的工作。几点注意

这只是我的个人观点,但我更希望导入时不要使用通配符,即使这意味着在 .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问题,所以我增加了该票测试以证明这一点。它还通过删除所有equals、hashCode以及Collection相关的内容来简化PersistentQueue。

(结果表明,由于ASeq已经实现了Obj,PersistentQueue实现Obj并不妨碍其使用。)

希望得到对这些方法、与之前的补丁以及CLJ-1070的补丁有何不同之处的评论。

0

评论由:ppotter

观察EmptyList实现List的方法,它与其它方法是重复的,但实际上不应该这样。我认为indexOf的实现是主要原因 - 应该仅仅是'return -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

评论者:jafingerhut

Philip,这次我认为是提交给CLJ-1000的补丁使您的补丁002-clj-1059-asequential.diff无法干净地应用。我经常修复那些变化简单且机械的陈旧补丁,但在这个情况下,您移动了一些CLJ-1000补丁更改的实现方法,所以最好是有人想法更新这个补丁,而不会破坏CLJ-1000的更改。

0

评论由:ppotter

感谢Andy。已提交新补丁,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仍然可以。

...