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联系之前提交this ticket。以下是讨论

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和hashCode相关内容以及所有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 仍然可以。

...