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添加了额外的接口 - PersistentQueue 维护列表,CLJ-1070 维护的是IHashEq。

0

评论者:[email protected]

Philip,补丁看起来相当不错 - 谢谢你做了这件事。几点需要注意

这只是我的观点,但我更喜欢在不使用通配符的情况下列出导入,即使是这意味着在 .java 文件顶部有额外几行。

我注意到“列出东西”的代码是 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 和哈希码;以及 ASeq,说实话,它现在似乎没有什么用了。

作为额外的好处,这个补丁还修复了 CLJ-1070,所以我添加了该票据中的测试来证明这一点。它还通过删除所有 equals/hashCode 东西和所有 Collection 东西来整理 PersistentQueue。

(实际上,由于 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

菲利普,我认为是这次提交给 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 主分支提交中,尤其是对 hasheq 的更改,补丁 002-clj-1059-asequential-rebased-to-cached-hasheq.diff 无法干净地应用。

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

...