2024 Clojure 状况调查! 中分享您的想法。

欢迎!请参阅 关于 页面以获取更多关于此功能的信息。

0
Clojure
user> (let [h (HashMap.)]
       (.put h 1 2)
       (let [p1 (first h)
             p2 (first {1 2})]
        (println (.hashCode p1) (.hashCode p2)
                 (= p1 p2) (= p2 p1)
                 (.equals p1 p2) (.equals p2 p1))))

3 994 false false true false

clojure.lang.MapEntry 没有遵循 hashCode 或 equals 的 java.util.Map$Entry 合同。 这导致了上述非反射的 .equals 行为。

我意识到这不仅仅是一个简单的错误;这是一个基本问题,因为不可能一致地实现 java.util.List 和 java.util.Map$Entry,这是 clojure.lang.MapEntry 主张的。 总体而言,我确实发现 Clojure 的映射条目与向量等价非常有用,可能不愿放弃这一点。 但我认为,至少应该在某个地方记录这个瑕疵,因为它可能导致一些非常奇怪且难以捕捉的错误。

4 答案

0

由 jawolfe 发布的评论:

这可能通过将 seq 改为承诺一对序列而不是 MapEntries 来修复。 我对 Clojure 内部了解不多,不知道这是否会涉及太大的性能损失,但或许值得考虑。

0

由 stu 发布的评论:

富:你有没有希望为此文档做的补丁?

0

评论者:richhickey

文档补丁好

0
参考:https://clojure.atlassian.net/browse/CLJ-750(由 jawolfe 报告)
...