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 文件有几行额外的导入列表,我也更倾向于将导入列表中不包含通配符。

我注意到“List 库”代码与 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/hashcCode 以及所有的 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

菲利普,我认为这次是因为提交给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 仍然可以。

...