2013-06-21 42 views
3

我需要将一些clojure文件编译成java字节码文件,将它们存储在磁盘上,以便稍后可以加载/执行它们。是否可以将一串Clojure代码编译为java的类?

我试过如下:

RT.load("clojure/core"); 
RT.init(); 
String clazz = "(ns org.rogach.avalanche.build (:gen-class)) (defn -doStuff [] (println 1))"; 
Compiler.load(new StringReader(clazz)); 
Compiler.load(new StringReader("(compile 'org.rogach.avalanche.build)")); 

但它失败:

Exception in thread "main" java.io.FileNotFoundException: 
Could not locate org/rogach/avalanche/build__init.class or org/rogach/avalanche/build.clj on classpath 

为了公平起见,究竟我是否来自Clojure的REPL直接执行该代码同样的事情发生。

此外,这种方法不会让我指定类文件的输出目录,这也很重要。

如何编译clojure代码到类文件?

+0

好奇:为什么你需要将Clojure代码编译成类文件? AOT编译增加了很多复杂性,通常在运行时从.clj文件编译/加载Clojure代码更容易。听起来有点像我的“XY问题”... – mikera

+0

@mikera - 我有一个程序,它将clojure文件作为配置文件。我已经知道如何评估代码,但是这需要初始化clojure运行时间,这需要大约1秒钟 - 我希望通过仅在更改时编译配置来解决此问题,并且如果未更改,只需加载并执行预编译的类文件。 – Rogach

+0

然后,这个问题的答案不会帮助你....加载和初始化'clojure.core'几乎可以肯定是什么原因导致启动时间,而不是加载和编译你的配置文件。 – mikera

回答

2

我强烈怀疑答案是:不是直接。

AOT编译的单元是名称空间,编译函数似乎在文件中查找名称空间。 我认为必须将Clojure文件写入正确的相对路径,以便编译函数可以找到合适的名称空间。

+0

有没有办法深入到编译器API编译?我不介意从clojure编译器复制一些代码,我只是不知道在哪里寻找。 – Rogach

相关问题