2015-11-01 46 views
1

我有一个Maven项目,我在clojure-maven-plugin的帮助下将Java和Clojure代码混合在一起。我的clojure代码被编译为AOT吗?

我有一个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(); 

运行此代码,“做的东西”是否正确被打印到屏幕。此外,我可以在Maven生成的jar中查看我的clojure代码的.class文件。尽管如此,我仍然不确定当我需要命名空间时clojure在做什么。它是否重新编译整个事物?或者,我的代码是正确的AOT编译与我的设置?

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

+0

我不知道回答你的问题,但[this](http://clojure.org/compilation)可能会有所帮助。 –

回答

1

要求不编译你的代码,它动态地加载必要的类。您的代码已经编译完成,除非您自己在另一个文件上调用compile

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