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] 制作

菲利普,补丁看起来相当不错——感谢你做这件事。以下几点建议

这只是我的个人意见,但即使这意味着在 .java 文件顶部多出几行,我也更喜欢没有通配符的导入列表。

我注意到“List stuff”代码是 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,因此我添加了该条目的测试以证明这一点。它还整理了 PersistentQueue,删除了所有 equals/hashcCode 东西以及所有 Collection 东西。

(结果是,由于 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仍然可以。

...