我有一个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();
运行此代码时,"做东西"正确地打印到屏幕上。此外,我可以在maven生成的jar中看到我的clojure代码的.class文件。尽管如此,我仍然不确定当我需要命名空间时,clojure会做什么。它是否再次编译整个事物?或者我的代码是否通过我的设置进行了正确的AOT编译?
最后,有没有办法可以将我的clojure代码视为"常规" java函数?也就是说,导入org.myproject.clojure并调用do-stuff作为常规函数?鉴于clojure正在为我的代码生成字节码。我不明白为什么java不能称它为字节码兼容。
答案 0 :(得分:1)
要求不编译代码,它会动态加载必要的类。您的代码已经编译,除非您自己在另一个文件上调用compile
。
其次,你不能将Clojure函数用作Java函数,因为它们不是同一个东西。如您所见,Clojure函数是实现IFn
和invoke
方法的对象。我不认为直接使用Java方法是可行的:你必须在类或实例上调用方法,但是哪些对象拥有这些方法?此外,使用对象来实现函数意味着它们是真正的第一类,并且您可以在运行时轻松更改绑定,这就是动态性。