_评论由: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))
Syntax error (NegativeArraySizeException) 编译错误 fn* at (REPL:1:1)。
null
我不会认为这是一个错误:`case*` 特殊形式的要求是映射必须排序,如果确实存在错误,它应该在源头,在任何负责递归和转换宏展开形式以及将排序映射转换为普通映射的代码中。
这在我过去曾多次受到影响,我建议(如附件中补丁所示)在第时间简单添加一个检查,如果映射没有排序则抛出异常。