对于“从Java调用Clojure”而言,大多数Google热门歌曲都已过时,建议您使用它clojure.lang.RT来编译源代码。假设您已经从Clojure项目构建了一个jar并将其包含在类路径中,那么您能否帮助您清楚地说明如何从Java调用Clojure?
从Clojure 1.6.0开始,有一种新的首选方式来加载和调用Clojure函数。现在,此方法优于直接调用RT(并在此取代了许多其他答案)。Javadoc在这里 -主要入口是clojure.java.api.Clojure。
要查找并调用Clojure函数:
IFn plus = Clojure.var("clojure.core", "+"); plus.invoke(1, 2);
中的功能clojure.core会自动加载。其他名称空间可以通过require加载:
clojure.core
require
IFn require = Clojure.var("clojure.core", "require"); require.invoke(Clojure.read("clojure.set"));
IFn可以传递给更高阶的函数,例如下面的示例传递plus给read:
IFn
plus
read
IFn map = Clojure.var("clojure.core", "map"); IFn inc = Clojure.var("clojure.core", "inc"); map.invoke(inc, Clojure.read("[1 2 3]"));
IFnClojure中的大多数s都引用函数。但是,有少数是指非功能数据值。要访问这些,请使用deref代替fn:
IFnClojure
IFn printLength = Clojure.var("clojure.core", "*print-length*"); IFn deref = Clojure.var("clojure.core", "deref"); deref.invoke(printLength);
有时(如果使用Clojure运行时的其他部分),你可能需要确保Clojure运行时已正确初始化-为此目的,在Clojure类上调用方法就足够了。如果你不需要在Clojure上调用方法,则只需使类加载就足够了(过去曾经有类似的建议来加载RT类;现在首选):
Class.forName("clojure.java.api.Clojure")