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 ...],但结果是相同的 -- 选择了错误的子句。将传入的值强制转换为 long 选择正确的子句(版本 1.11.1)。

非常希望能看到这个问题被修复。

2 个答案

0

评论者:bronsa

补丁是一个简单的搜索和替换,除了diff中的第30行相当复杂:我认为在之前实现中使用 h有一个之前从未暴露过的bug。但是,因为hashEq不是双重散列,所以会导致碰撞节点永远不会匹配。

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