从Java调用Clojure
对于“从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
加载:
IFn require = Clojure.var("clojure.core", "require");require.invoke(Clojure.read("clojure.set"));
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:
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")
以上是 从Java调用Clojure 的全部内容, 来源链接: utcz.com/qa/415275.html