2015-11-01 47 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方法是可行的:您必須調用類或實例的方法,但是哪些對象擁有方法?此外,使用對象實現功能意味着它們確實是一流的,並且您可以在運行時輕鬆更改綁定,這就是動態性的意義所在。