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

欢迎!请查阅关于页面以了解更多关于这部分的信息。

0
Clojure

持久队列实现了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组件,但不是一个列表,ArrayList是一个列表,但不是一个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 选项吗?

我挣扎着不知道自己是否应该在行尾添加 CR,因为我所编辑的文件在这一点上并不一致。如果你在 emacs 中打开它们,一半的行都以 ^M 结尾。

0

评论者:ppotter

我将提交另一个补丁,其中 import 已更改。我将考虑列表实现,看看我能想出什么主意。

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;',但它有一个很大的循环!但这超出了这个票证的范畴,所以我在这里不会修复它。

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 master分支所做的提交,特别是对hasheq的更改,使得补丁002-clj-1059-asequential-rebased-to-cached-hasheq.diff无法干净地应用。

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

...