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而不是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]

菲利普,补丁看起来相当不错——感谢你为此付出努力。几点说明

这只是我的个人看法,但我不太喜欢带通配符的导入列表,即使这意味着在.class文件顶部多出几行。

我注意到“列出内容”的代码是从ASeq和EmptyList中复制过来的。我想这是因为他们复制了EmptyList和PersistentQueue都扩展了Obj,因此不能再扩展ASeq。这是唯一的原因吗?重复这些方法定义似乎很可惜,但我不知道有更好的解决方案,您有吗?

也很希望测试能检查几个您实现的List方法。

0

评论者:[email protected]

哦,还有,“git am”拒绝应用补丁,但我不确定原因。“patch -p 1”一切正常。

0

评论者:ppotter

您是否使用了--keep-cr选项来git am?

我在考虑是否应该在行尾添加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/hashCode东西以及所有Collection相关内容。

(结果发现,由于ASeq已经实现了Obj,PersistentQueue实现Obj的事实并没有阻碍使用它。)

欢迎对这个方法提出评论,以及它与这里之前的补丁和CLJ-1070的补丁有哪些不同。

0
by

评论者:ppotter

查看EmptyList对List的实现,它与其它的是重复的,但它不应该如此。我认为它的indexOf实现是最大的问题所在——它应该只是返回'return -1;',但它有一个非常大的循环!但这已经超出了这个问题的范围,所以我在这里不会修复它。

0
by

评论者:jafingerhut

Philip,现在CLJ-1070的补丁已经应用,这些补丁不再干净地应用。你愿意更新它们吗?如果是这样的话,请删除过时的补丁。

0
by

评论者:ppotter

Andy,非常感谢你让人们意识到这些事情的努力。我确实会提交新的补丁,希望这周晚些时候。

0
by

评论者:ppotter

用新的补丁替换了现有的可以cleanly应用到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仍然可以。

...