clojure clj -> java

2022-04-08  本文已影响0人  onedam
(ns ast.testclass)
(defn one [x] x)    

-> 1个 extends AFunction 的class 2个 invoke 的 method .
(汉景帝 梁王 ) qinxiongdi....

package ast;

import clojure.lang.AFunction;

public final class testclass$one extends AFunction {
    public classfile$one() {
    }

    public static Object invokeStatic(Object x) {
        Object var10000 = x;
        x = null;
        return var10000;
    }

    public Object invoke(Object var1) {
        Object var10000 = var1;
        var1 = null;
        return invokeStatic(var10000);
    }
}
(defn two [x] (+ 2 x))
(defn three [x] (let [a 10] (prn x) (list 2 x)))
package ast;

import clojure.lang.AFunction;
import clojure.lang.Numbers;

public final class testclass$two extends AFunction {
    public classfile$two() {
    }

    public static Object invokeStatic(Object x) {
        Object var10001 = x;
        x = null;
        return Numbers.add(2L, var10001);
    }

    public Object invoke(Object var1) {
        Object var10000 = var1;
        var1 = null;
        return invokeStatic(var10000);
    }
}



package ast;

import clojure.lang.AFunction;
import clojure.lang.IFn;
import clojure.lang.RT;
import clojure.lang.Var;

public final class testclass$three extends AFunction {
    public static final Var const__1 = (Var)RT.var("clojure.core", "prn");
    public static final Var const__2 = (Var)RT.var("clojure.core", "list");
    public static final Object const__3 = 2L;

    public classfile$three() {
    }

    public static Object invokeStatic(Object x) {
        long a = 10L;
        ((IFn)const__1.getRawRoot()).invoke(x);
        IFn var10000 = (IFn)const__2.getRawRoot();
        Object var10002 = x;
        x = null;
        return var10000.invoke(const__3, var10002);
    }

    public Object invoke(Object var1) {
        Object var10000 = var1;
        var1 = null;
        return invokeStatic(var10000);
    }
}
; 加了 类型 后 会使用 IFN 中定义的奇怪的 接口  . 性能 提高
(defn jialei
 ^long
 [^long hash-basis ^long count] (+ hash-basis count))
package ast;

import clojure.lang.AFunction;
import clojure.lang.Numbers;
import clojure.lang.RT;
import clojure.lang.IFn.LLL;

public final class testclass$jialei extends AFunction implements LLL {
    public testclass$jialei() {
    }

    public static long invokeStatic(long hash_basis, long var2) {
        return Numbers.add(hash_basis, var2);
    }

    public Object invoke(Object var1, Object var2) {
        return invokeStatic(RT.longCast((Number)var1), RT.longCast((Number)var2));
    }

    public final long invokePrim(long var1, long var3) {
        return invokeStatic(var1, var3);
    }
}

注意 defmacro

(defmacro m1 [x] (list x 3))

生成的类中没法体现出是 macro . 答案在 testclass__init 类中 的

 const__32 = (Var)RT.var("ast.testclass", "m1");

 Var var10009 = const__32;
 var10009.setMeta((IPersistentMap)const__35);
 var10009.bindRoot(new m1());
 ((Var)const__32).setMacro();

 const__35 = (AFn)RT.map(new Object[]{RT.keyword((String)null, "arglists"), PersistentList.create(Arrays.asList(Tuple.create(Symbol.intern((String)null, "x")))), RT.keyword((String)null, "line"), 18, RT.keyword((String)null, "column"), 1, RT.keyword((String)null, "file"), "ast/testclass.clj"});

package ast;

import clojure.lang.AFunction;
import clojure.lang.IFn;
import clojure.lang.RT;
import clojure.lang.Var;

public final class testclass$m1 extends AFunction {
    public static final Var const__0 = (Var)RT.var("clojure.core", "list");
    public static final Object const__1 = 3L;

    public testclass$m1() {
    }

    public static Object invokeStatic(Object _AMPERSAND_form, Object _AMPERSAND_env, Object x) {
        IFn var10000 = (IFn)const__0.getRawRoot();
        Object var10001 = x;
        x = null;
        return var10000.invoke(var10001, const__1);
    }

    public Object invoke(Object var1, Object var2, Object var3) {
        Object var10000 = var1;
        var1 = null;
        Object var10001 = var2;
        var2 = null;
        Object var10002 = var3;
        var3 = null;
        return invokeStatic(var10000, var10001, var10002);
    }
}
package ast;

import ast.testclass.five;
import ast.testclass.fn__2076;
import ast.testclass.four;
import ast.testclass.jialei;
import ast.testclass.loading__6721__auto____2074;
import ast.testclass.m1;
import ast.testclass.one;
import ast.testclass.three;
import ast.testclass.two;
import ast.testclass.when;
import clojure.lang.AFn;
import clojure.lang.Compiler;
import clojure.lang.IFn;
import clojure.lang.IObj;
import clojure.lang.IPersistentMap;
import clojure.lang.LockingTransaction;
import clojure.lang.PersistentList;
import clojure.lang.RT;
import clojure.lang.Symbol;
import clojure.lang.Tuple;
import clojure.lang.Var;
import java.util.Arrays;
import java.util.concurrent.Callable;

public class testclass__init {
    public static final Var const__0;
    public static final AFn const__1;
    public static final AFn const__2;
    public static final Var const__3;
    public static final AFn const__11;
    public static final Var const__12;
    public static final AFn const__15;
    public static final Var const__16;
    public static final AFn const__19;
    public static final Var const__20;
    public static final AFn const__23;
    public static final Var const__24;
    public static final AFn const__27;
    public static final Var const__28;
    public static final AFn const__31;
    public static final Var const__32;
    public static final AFn const__35;
    public static final Var const__37;
    public static final AFn const__42;

    public static void load() {
        ((IFn)const__0.getRawRoot()).invoke(const__1);
        ((IFn)(new loading__6721__auto____2074())).invoke();
        Object var10002;
        if (((Symbol)const__1).equals(const__2)) {
            var10002 = null;
        } else {
            LockingTransaction.runInTransaction((Callable)(new fn__2076()));
            var10002 = null;
        }

        Var var10003 = const__3;
        var10003.setMeta((IPersistentMap)const__11);
        var10003.bindRoot(new one());
        Var var10004 = const__12;
        var10004.setMeta((IPersistentMap)const__15);
        var10004.bindRoot(new two());
        Var var10005 = const__16;
        var10005.setMeta((IPersistentMap)const__19);
        var10005.bindRoot(new three());
        Var var10006 = const__20;
        var10006.setMeta((IPersistentMap)const__23);
        var10006.bindRoot(new four());
        Var var10007 = const__24;
        var10007.setMeta((IPersistentMap)const__27);
        var10007.bindRoot(new five());
        Var var10008 = const__28;
        var10008.setMeta((IPersistentMap)const__31);
        var10008.bindRoot(new jialei());
        Var var10009 = const__32;
        var10009.setMeta((IPersistentMap)const__35);
        var10009.bindRoot(new m1());
        ((Var)const__32).setMacro();
        Object var10010 = null;
        Var var10011 = const__32;
        Var var10012 = const__37;
        var10012 = var10012.ns.refer(var10012.sym, var10012);
        var10012.setMeta((IPersistentMap)const__42);
        var10012.bindRoot(new when());
        ((Var)const__37).setMacro();
        Object var10013 = null;
        Var var10014 = const__37;
    }

    public static void __init0() {
        const__0 = (Var)RT.var("clojure.core", "in-ns");
        const__1 = (AFn)Symbol.intern((String)null, "ast.testclass");
        const__2 = (AFn)Symbol.intern((String)null, "clojure.core");
        const__3 = (Var)RT.var("ast.testclass", "one");
        const__11 = (AFn)RT.map(new Object[]{RT.keyword((String)null, "arglists"), PersistentList.create(Arrays.asList(Tuple.create(Symbol.intern((String)null, "x")))), RT.keyword((String)null, "line"), 3, RT.keyword((String)null, "column"), 1, RT.keyword((String)null, "file"), "ast/testclass.clj"});
        const__12 = (Var)RT.var("ast.testclass", "two");
        const__15 = (AFn)RT.map(new Object[]{RT.keyword((String)null, "arglists"), PersistentList.create(Arrays.asList(Tuple.create(Symbol.intern((String)null, "x")))), RT.keyword((String)null, "line"), 4, RT.keyword((String)null, "column"), 1, RT.keyword((String)null, "file"), "ast/testclass.clj"});
        const__16 = (Var)RT.var("ast.testclass", "three");
        const__19 = (AFn)RT.map(new Object[]{RT.keyword((String)null, "arglists"), PersistentList.create(Arrays.asList(Tuple.create(Symbol.intern((String)null, "x")))), RT.keyword((String)null, "line"), 5, RT.keyword((String)null, "column"), 1, RT.keyword((String)null, "file"), "ast/testclass.clj"});
        const__20 = (Var)RT.var("ast.testclass", "four");
        const__23 = (AFn)RT.map(new Object[]{RT.keyword((String)null, "arglists"), PersistentList.create(Arrays.asList(Tuple.create(Symbol.intern((String)null, "a"), Symbol.intern((String)null, "b"), Symbol.intern((String)null, "c")))), RT.keyword((String)null, "line"), 6, RT.keyword((String)null, "column"), 1, RT.keyword((String)null, "file"), "ast/testclass.clj"});
        const__24 = (Var)RT.var("ast.testclass", "five");
        const__27 = (AFn)RT.map(new Object[]{RT.keyword((String)null, "arglists"), PersistentList.create(Arrays.asList(Tuple.create(Symbol.intern((String)null, "x")), Tuple.create(Symbol.intern((String)null, "x"), Symbol.intern((String)null, "y")), Tuple.create(Symbol.intern((String)null, "x"), Symbol.intern((String)null, "y"), Symbol.intern((String)null, "z")))), RT.keyword((String)null, "line"), 8, RT.keyword((String)null, "column"), 1, RT.keyword((String)null, "file"), "ast/testclass.clj"});
        const__28 = (Var)RT.var("ast.testclass", "jialei");
        const__31 = (AFn)RT.map(new Object[]{RT.keyword((String)null, "arglists"), PersistentList.create(Arrays.asList(((IObj)Tuple.create(((IObj)Symbol.intern((String)null, "hash-basis")).withMeta((IPersistentMap)RT.map(new Object[]{RT.keyword((String)null, "tag"), Symbol.intern((String)null, "long")})), ((IObj)Symbol.intern((String)null, "count")).withMeta((IPersistentMap)RT.map(new Object[]{RT.keyword((String)null, "tag"), Symbol.intern((String)null, "long")})))).withMeta((IPersistentMap)RT.map(new Object[]{RT.keyword((String)null, "tag"), Symbol.intern((String)null, "long")})))), RT.keyword((String)null, "line"), 14, RT.keyword((String)null, "column"), 1, RT.keyword((String)null, "file"), "ast/testclass.clj"});
        const__32 = (Var)RT.var("ast.testclass", "m1");
        const__35 = (AFn)RT.map(new Object[]{RT.keyword((String)null, "arglists"), PersistentList.create(Arrays.asList(Tuple.create(Symbol.intern((String)null, "x")))), RT.keyword((String)null, "line"), 18, RT.keyword((String)null, "column"), 1, RT.keyword((String)null, "file"), "ast/testclass.clj"});
        const__37 = (Var)RT.var("ast.testclass", "when");
        const__42 = (AFn)RT.map(new Object[]{RT.keyword((String)null, "arglists"), PersistentList.create(Arrays.asList(Tuple.create(Symbol.intern((String)null, "test"), Symbol.intern((String)null, "&"), Symbol.intern((String)null, "body")))), RT.keyword((String)null, "doc"), "Evaluates test. If logical true, evaluates body in an implicit do.", RT.keyword((String)null, "added"), "1.0", RT.keyword((String)null, "line"), 19, RT.keyword((String)null, "column"), 1, RT.keyword((String)null, "file"), "ast/testclass.clj"});
    }

    static {
        __init0();
        Compiler.pushNSandLoader(RT.classForName("ast.testclass__init").getClassLoader());

        try {
            load();
        } catch (Throwable var1) {
            Var.popThreadBindings();
            throw var1;
        }

        Var.popThreadBindings();
    }
}

编译原理 需要掌握 源语言 和 目标语言

上面生成的 xxx__init.class 调用点 RT.java

static final public String LOADER_SUFFIX = "__init";
static public void load(String scriptbase, boolean failIfNotFound) throws IOException, ClassNotFoundException{
    String classfile = scriptbase + LOADER_SUFFIX + ".class";

宏生成的类。 每次load 加载到 ns 中的Var 时已变成了 可用的无宏 xxx

上一篇下一篇

猜你喜欢

热点阅读