【问题标题】:Is my clojure code being AOT compiled?我的 clojure 代码是否被 AOT 编译?
【发布时间】:2016-02-01 12:46:27
【问题描述】:

我有一个 Maven 项目,我在 clojure-maven-plugin 的帮助下混合了 java 和 Clojure 代码。

我有一个这样的 Clojure 命名空间:

(ns org.myproject.clojure
    (:gen-class))

(defn do-stuff [] (println "Doing stuff"))

在java中,我这样称呼它:

IFn require = Clojure.var("clojure.core", "require");
require.invoke(Clojure.read("org.myproject.clojure"));
IFn do_stuff = Clojure.var("org.myproject.clojure", "do-stuff");
do_stuff.invoke();

运行此代码时,“Doing stuff”会正确打印到屏幕上。此外,我可以在 maven 生成的 jar 中看到我的 clojure 代码的 .class 文件。尽管如此,当我需要命名空间时,我仍然不确定 clojure 在做什么。它是重新编译整个事情吗?或者我的代码是否使用我的设置正确编译了 AOT?

最后,有没有办法可以将我的 clojure 代码视为“常规”java 函数?也就是说,导入 org.myproject.clojure 并将 do-stuff 作为常规函数调用?鉴于 clojure 正在为我的代码生成字节码。我不明白为什么 java 不能称它为字节码兼容。

【问题讨论】:

  • 我知道的不够多,无法回答您的问题,但this 可能会有所帮助。

标签: java maven clojure


【解决方案1】:

Require 不会编译您的代码,它会动态加载必要的类。您的代码已经编译,当然除非您自己在另一个文件上调用 compile

其次,您不能将 Clojure 函数用作 Java 函数,因为它们不是同一个东西。如您所见,Clojure 函数是实现IFn 并具有invoke 方法的对象。我认为直接使用 Java 方法是不可行的:您必须在类或实例上调用方法,但哪些对象拥有这些方法?此外,使用对象来实现函数意味着它们是真正的一流,并且您可以在运行时轻松更改绑定,这就是动态性的意义所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多