已知条件
(let [c (char 110)]
(case c \n (println "lol")))
如果我从 运行 decompile
我得到以下输出
public final class json$fn__15103 extends AFunction {
public static final Object const__2;
public static final Var const__3;
public static final Var const__4;
public static Object invokeStatic() {
final char G__15104;
final char c = G__15104 = RT.charCast(110L);
switch (Util.hash(G__15104)) {
case 110: {
if (Util.equiv((Object)G__15104, json$fn__15103.const__2)) {
return ((IFn)json$fn__15103.const__3.getRawRoot()).invoke("lol");
}
break;
}
}
throw new IllegalArgumentException((String)((IFn)json$fn__15103.const__4.getRawRoot()).invoke("No matching clause: ", G__15104));
}
@Override
public Object invoke() {
return invokeStatic();
}
static {
const__2 = 'n';
const__3 = RT.var("clojure.core", "println");
const__4 = RT.var("clojure.core", "str");
}
}
我的问题是(考虑到这个反汇编是正确的),为什么编译器生成 if
测试,更有趣的是,是否有方法去掉它(通过指导编译器的方式)?
也许我认为我不应该关心这个问题,因为 JIT 会帮我处理好它,但是仍然是。
此外,有人可能会争辩说,我想,既然我们知道我正在对 "char
" 做的 case,那么没有必要在它上面做 "Util.hash
"?