如何通过函数调用IFN接口定义的clj文件中的clojure方法



我尝试读取Clojure的编译器源代码

我知道主要方法是在JVM/Clojure/main.java

还有一个Java文件具有主要方法:jvm/clojure/lang/compile.java

似乎我想获得clojure.jar时我无法编译Clj文件,尽管默认情况下,CLJ文件将被编译。我可以删除pom.xml中的" clojure-compile"部分,获得1.8m clojure.jar,不是4.6m clojure.jar.jar。

在main.java中,似乎Clojure将创建许多默认名称空间,vars,符号

然后,它将使用IFN.Java中定义的.clj文件中定义的某些方法"调用",如下:

in_ns.invoke(USER);
refer.invoke(CLOJURE);
require.invoke(SERVER);
start_servers.invoke(System.getProperties());
REQUIRE.invoke(CLOJURE_MAIN);
MAIN.applyTo(RT.seq(args));

然后爆炸!clojure可以工作,我可以运行( 1 1(

但是我找不到Invoke方法的实现位置。似乎是空的。在var.java中,接口是这样实现的:

 return fn().invoke(Util.ret1(arg1,arg1=null));
final public IFn fn(){
return (IFn) deref();
}
final public Object deref(){
TBox b = getThreadBinding();
if(b != null)
    return b.val;
return root;
}

螺纹似乎有:

Var.pushThreadBindings(
        RT.mapUniqueKeys(CURRENT_NS, CURRENT_NS.deref(),
               WARN_ON_REFLECTION, WARN_ON_REFLECTION.deref()
                ,RT.UNCHECKED_MATH, RT.UNCHECKED_MATH.deref()));

无论如何,我阅读了源代码时间,似乎已经创建了许多数据结构,但是我不知道如何调用CLJ文件中定义的方法,即使我无法编译CLJ文件,也只保留它们textfile

你能教我吗?谢谢!

尚不清楚您要实现的目标。您是否正在尝试从头开始编译Clojure?您是否正在尝试了解Clojure编译器的工作原理?

看来您也没有从合适的班级开始。clojure.main中的类是clojure重复本身,而不是编译器。实际上,您可以从Java启动它:

$ java -cp /home/denis/.m2/repository/org/clojure/clojure/1.10.0/clojure-1.10.0.jar:/home/denis/.m2/repository/org/clojure/spec.alpha/0.2.176/spec.alpha-0.2.176.jar clojure.main
Clojure 1.10.0
user=> (+ 1 2)
3

在Clojure汇编过程中有一个参考文档可能有用:https://clojure.org/reference/compilation。要记住的重要事项是在文档的开头:

clojure将您直接加载到JVM bytecode

中加载的所有代码

每次定义一个函数或加载文件时,都会生成某些字节。这将包括一个或多个.class文件,其中一些可能是实现IFN接口的类。

最新更新