已知
(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
操作,对吧?