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但不是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, 15/Sep/12

请注意,此补丁与我添加到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发表

你在 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 问题,因此我添加了该票证的测试以展示这一点。它还通过删除所有 equals/hashcCode 和所有 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

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仍然可以。

...