2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面以获取更多关于如何使用本站的信息。

0
Clojure

持久队列PersistentQueue实现了Sequential接口,但未实现java.util.List接口。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]

菲利普,补丁看起来非常好——感谢你做了这件事。以下是一些建议

这仅代表我的个人意见,但我觉得导入列表应该不使用通配符,即使这意味着在 .java 文件的顶部需要多几行。

我发现“列出内容”代码是 ASeq 和 EmptyList 中的副本。我认为这是因为在 EmptyList 和 PersistentQueue 扩展 Obj 的前提下,无法扩展 ASeq,所以需要复制。这 是唯一的理由吗?似乎重复这些方法定义有点尴尬,但你不知道更好的解决方案吗?

也很希望测试能检查你实现的一些 List 方法。

0

评论者:[email protected]

哦,顺便说一句,“git am”拒绝应用补丁,但我不确定为什么。“patch -p 1”工作得非常好。

0

评论者:ppotter

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

我努力想弄清楚是否应该在行尾添加 CRs,因为我在编辑的文件在这一点上并不一致。如果你在 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 的问题,所以我加入了这个 ticket 中的测试来证明这一点。它还通过移除所有的 equals/hashCode 东西和所有 Collection 东西来整理 PersistentQueue。

(结果证明,由于 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主线代码,特别是对hasheq的更改,补丁 002-clj-1059-asequential-rebased-to-cached-hasheq.diff 已经不再能干净地应用。

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

...