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

欢迎!有关如何工作的更多信息,请参阅关于页面。

+6
Clojure

user=> (case -1 -1 true false) true user=> (case [-1] [-1] true false) true user=> (case (int -1) -1 true false) true user=> (case [(int 1)] [1] true false) true user=> (case [(int -1)] [-1] true false) false

最后一个案例应该与其它一样返回 true,

触发此问题的现实生活中的例子

(case [">" (compare 2 3)] [">" -1] true false) ;; false?

解释:这是由 case 在比较时使用 hashCode 而不是 hashEq 以及负整数和负长整数在散列时不同,而正整数散列相同所导致的。
建议:case 使用 hasheq 而不是 hashCode

补丁:0001-switch-to-hasheq-for-case.patch

我昨天遇到了这个问题,花了一段时间才弄清楚这是根本问题。在该代码中是 (-1 :x) 而不是 [-1 ...],但结果相同 - 选择错误的分支。将传入的值强制转换为长整型选择了正确的分支(1.11.1版本)。

很高兴看到这个问题得到修复。

2 个回答

0

评论者:bronsa

修补程序是一个直接搜索和替换功能,除了差异文件的第30行较为复杂:我认为在之前的实现中使用 h 存在一个缺陷,由于正整数的hashCode是幂等的,而这个缺陷从未被揭示。但是,由于hashEq不是双重哈希,这可能会导致碰撞节点永远不会匹配。

0
参考: https://clojure.atlassian.net/browse/CLJ-2275(由 alex+import 报告)
...