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

请注意,此补丁与我为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 的替代方案。

所以我考虑了你的建议,但我觉得直接让 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
by

评论由:ppotter制作

查看EmptyList实现List的部分,它与其它部分是重复的,但这不应该存在。我认为其indexOf的实现是最大的罪魁祸首——它应该直接返回'return -1;',但是它有一个巨大的for循环!但这些都超出了这个问题的范围,所以我不在这里修补它。

0
by

评论者:jafingerhut

Philip,现在CLJ-1070的补丁已应用,这些补丁就不再纯净。您愿意更新它们吗?如果是的话,请删除过时的补丁。

0
by

评论由:ppotter制作

Andy,非常感谢您的努力使得人们注意到这些问题。我确实会提交新的补丁,希望在本周内完成。

0
by

评论由:ppotter制作

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

有两个补丁

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

这个补丁通过让PersistentQueue直接实现List来修复等价性。我还利用这个机会移除了通配符导入,并为List方法添加了测试,与补丁的先前版本相比。

002-clj-1059-asequential.diff

这个补丁通过创建一个新的抽象类ASequential,并让PersistentQueue扩展这个类来修复等价性。

我仍然首选ASequential补丁,但我还是把两个补丁都保留在这里进行比较。

0
by

评论者:halgari

审查。

0
by

评论者: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仍然可以。

...