_评论人:bronsa_
一种触发这种情况的方法是手动复制已宏展开的代码。这会将字面量作为正常映射而非排序映射读取。
user=> (clojure.core/let
[G__8112 :a]
(case*
G__8112
0
31
(throw
(java.lang.IllegalArgumentException.
(clojure.core/str "没有匹配的条款: " G__8112)))
{3 [:b-36 36],
4 [:b-37 37],
6 [:b-40 40],
13 [:b-39 39],
14 [:b-38 38],
18 [:a-42 42],
20 [:a-40 40],
21 [:a-38 38],
22 [:a-37 37],
24 [:a-39 39],
27 [:b-42 42],
28 [:a-36 36]}
:compact
:hash-identity
nil))
语法错误(NegativeArraySizeException)在fn*编译时于(REPL:1:1)。
null
我不会将此视为一个bug:case*特殊形式的合约要求映射必须是排序的,如果有任何bug,它可能是上游的,在负责遍历和转换宏展开形式并将排序映射转换为常规映射的任何代码中。
这以前几次让我感到意外,我的建议(在附加的补丁中 实现)是在分析时简单地添加一个检查,如果映射没有排序则抛出异常。