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

欢迎!请参阅关于页面了解更多此功能的信息。

0
Clojure

持久队列(PersistentQueue)实现(Sequential)但不实现java.util.List。列表和序列量(Sequentials)都形成了一个等价类。这意味着您最终可能得到非传递性相等性

(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,日期 15/Sep/12

注意,此补丁与我添加到 CLJ-1070 中的补丁有细微冲突,因为我们都在 PersistentQueue 中添加了一个额外接口——这里是 List,而在 CLJ-1070 中是 IHashEq。

0

评论者:[email protected]

菲利普,补丁看起来相当不错——感谢你做这件事。这里有一些意见

这只是我个人的看法,但我比较喜欢将导入列表列出时不使用通配符,即使这意味着要在 .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 和 hashcode;以及 ASeq,坦白说,它似乎不再做什么了。

作为额外的好处,这个补丁还解决了 CLJ-1070 的问题,所以我添加了那个问题中的测试来证明这一点。我还整理了 PersistentQueue,移除了所有 equals/hashcode 东西以及所有 Collection 东西。

(结果证明,因为 ASeq 已经实现了 Obj,所以 PersistentQueue 实现 Obj 并没有成为使用它的障碍。)

欢迎对该方法提出评论,以及它和此处之前补丁以及CLJ-1070上的补丁的不同之处。

0

评论者:ppotter

查看EmptyList对List的实现,它是与其它相同的,但不应如此。我认为indexOf的实现是问题的根源 - 它应该是'返回-1',但有一个巨大的for循环!但这已经超出了这个条目的范围,所以这里不会修复。

0

评论者:jafingerhut

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

0

评论者:ppotter

Andy,非常感谢你为让人们了解这些事所付出的努力。我确实会提交新的补丁,希望在本周晚些时候。

0

评论者:ppotter

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

有两个补丁

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

这个补丁通过让PersistentQueue直接实现List来修复了等价性问题。我还借此机会去掉了 wildcard 导入,并为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 master 进行了提交,尤其是对 hasheq 的更改,使得补丁 002-clj-1059-asequential-rebased-to-cached-hasheq.diff 无法干净地应用。

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

...