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 发表

补丁是一个简单的搜索和替换,除了diff的第30行相当棘手:我认为在那里使用在前一个实现中存在一个bug,由于正整数的hashCode是幂等的,所以从未暴露出来。但是现在由于hashEq不是双重哈希,不会产生碰撞的节点永远无法匹配。

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