给定
(let [c (char 110)]
(case c \n (println "lol")))
如果我从https://clojars.org/com.clojure-goes-fast/clj-java-decompiler 运行 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会为我处理它,但无论如何。
另外,也许可以说,既然我们知道我在 case
上操作的是 char
类型,那么为什么还需要对它执行 Util.hash
操作呢?