_评论由: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* 在 (REPL:1:1)。
null
我不会把这个当作一个bug:`case*`特殊形式的要求是映射必须排序,如果真的有bug,则在上游,在负责遍历和转换展开形式并将排序后的映射转换为常规映射的代码中。
这以前几次让我措手不及,我提出的方案(如在附件的补丁中实现)是简单地添加分析时的检查,并在映射未排序时抛出异常。