评论者: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
我不会把这看作一个错误:`case*` 特殊形式的契约要求映射(map)是有序的。如果确实存在错误,它在上游,在任何负责遍历和转换宏展开形式,并将排序映射转换为常规映射的代码中。
这曾几次让我始料未及,我提出的建议(如附带的补丁所示)是在分析时简单地添加一个检查,如果不排序则抛出错误。