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但不是列表,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]

Philip,补丁看起来相当不错——谢谢你的贡献。一些建议

这只是我的个人看法,但我不太喜欢使用通配符导入,即便这意味着在 .java 文件顶部增加几行。

我注意到 "List stuff" 代码是 ASeq 和 EmptyList 中的副本。我想这是因为 EmptyList 和 PersistentQueue 扩展了 Obj,因此不能扩展 ASeq。这只是唯一的原因吗?重复这些方法定义似乎有些可惜,但我不确定是否有更好的解决方案,你知道吗?

最好还能测试你实现的一些 List 方法。

0

评论者:[email protected]

哦,还有,“git am” 实际上拒绝应用这个补丁,但我不确定原因。“patch -p 1” 完美运行。

0

评论由ppotter发表

你在 git am 中使用了 --keep-cr 选项吗?

我 struggle 的不是知道是否应该将 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 的相性和哈希值;以及 ASeq,实话实说,似乎不再做什么了。

此外,该补丁还修复了CLJ-1070问题,因此我添加了该票证的测试来证明这一点。它还对PersistentQueue进行了整理,移除了所有equals/hashCode相关的东西和所有Collection相关的东西。

(事实证明,由于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仍然可以得到应用。

...