【问题标题】:Is it possible to compile a string of Clojure code to classes from java?是否可以将一串 Clojure 代码编译为 java 中的类?
【发布时间】:2013-06-21 16:24:57
【问题描述】:

我需要将一些 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 代码编译为类文件?

【问题讨论】:

  • 好奇:为什么需要将 Clojure 代码编译成类文件? AOT 编译增加了很多复杂性,通常在运行时从 .clj 文件编译/加载 Clojure 代码更容易。对我来说听起来有点像“XY 问题”......
  • @mikera - 我有一个程序,它将 clojure 文件作为配置文件。我已经知道如何评估该代码,但这需要初始化 clojure 运行时,这需要大约 1 秒 - 我希望通过仅在更改配置时编译配置来解决此问题,如果未更改,只需加载并执行预编译的类文件。
  • 那么这个问题的答案对你没有帮助......加载和初始化clojure.core 几乎可以肯定是导致启动时间的原因,而不是加载和编译你的配置文件。
  • 那么没有~1秒的开销就绝对没有办法执行clojure代码?有没有办法加快速度?
  • Clojure 的启动时间总是很长,直到有人修改编译器/引导代码。我现在推荐的解决方案(如果您关心延迟)是保持持久的 JVM / REPL 实例运行,这样启动时间就不是问题了。

标签: java clojure compilation


【解决方案1】:

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

AOT编译的单位是namespace,compile函数好像是在文件中寻找namespace。 我认为有必要将Clojure文件写入正确的相对路径,以便编译函数可以找到合适的命名空间。

【讨论】:

  • 有没有办法深入编译器 API 进行编译?我不介意从 clojure 编译器复制一些代码,我只是不知道去哪里找。
【解决方案2】:

看看 Nakkaya 的Programmatically compiling java code using clojure。我过去曾使用过它,并且是对如何将其扩展到接口发表评论的人。我不确定您的用例,但这符合您的要求。

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 2010-09-13
    • 1970-01-01
    • 2016-02-01
    • 2012-09-22
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多