_bronsa_发表的评论
触发的这种问题的一种方式是将宏展开的代码手动复制出来。这强制将字面量作为普通映射而不是排序映射来读取。
user=> (clojure.core/let
[G__8112 :a]
(case*
G__8112
0
31
(throw
(java.lang.IllegalArgumentException.
(clojure.core/str "No matching clause: " 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*`特殊形式的合同要求映射必须排序,如果存在任何错误,那应该是上游的,即在遍历和转换宏展开形式并将排序后的映射转换为常规映射的任何代码中。
这在我过去几年里遇到了几次,我提出的建议(如附加补丁中实现的那样)是在分析时间简单地添加一个检查,如果映射未排序则抛出。