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

欢迎!请参阅关于页面,以了解更多有关如何使用此功能的信息。

0
Clojure

持久队列(PersistentQueue)实现了Sequential接口,但未实现java.util.List接口。顺序(Sequentials)形成一个平等的分区,正如列表(Lists)一样。这意味着你可能会得到非递归的平等

(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)是一个顺序但不是一个列表,ArrayList是一个列表但不是一个顺序,而持久向量(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。这真的是唯一的原因吗?似乎重复这些方法定义有些可惜,但我不知道有没有更好的解决方案,你知道吗?

最好也测试一下你实现的一些列表方法。

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的问题,所以我添加了该票据中的测试以证明这一点。它还通过移除所有equals(hashcCode)和Collection相关的内容来整理PersistentQueue。

(实际上,因为ASeq已经实现了Obj,PersistentQueue实现Obj的事实并没有阻碍它的使用。)

请对这种方法进行评论,并说明它与这里之前的补丁和CLJ-1070的补丁有何不同。

0
回答: by

由:ppotter

观察EmptyList实现List,它与其他的是重复的,但不应如此。我认为它的indexOf实现是最大的罪魁祸首——它应该只是'return -1;'但有一个很长的for循环!但这超出了此补丁的范围,所以我在这里不会修复它。

0
by

评论人:jafingerhut

Philip,由于CLJ-1070补丁已应用,这些补丁不再整洁地应用。你愿意更新它们吗?如果是这样,请删除过时的补丁。

0
by

由:ppotter

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

0
by

由:ppotter

用新的补丁替换了现有的补丁,这些补丁可干净地应用到master。

有两个补丁

001-clj-1059-make-persistentqueue-implement-list.diff

这个通过使PersistentQueue直接实现List来修复等价性。我还趁机移除了通配符导入并添加了对List方法的测试,与补丁的先前版本相比。

002-clj-1059-asequential.diff

这个通过创建一个新的抽象类ASequential,并让PersistentQueue继承它来修复等价性。

我最喜欢的解决方案仍然是ASequential补丁,但我将两个都保留在这里以供比较。

0
by

评论人:halgari

审查。

0
by

评论人: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 master的commits,尤其是对hasheq的更改,补丁002-clj-1059-asequential-rebased-to-cached-hasheq.diff不再能干净应用。

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

...