在以下链接Calling clojure from java中,说明了如何编写一段clojure代码,然后我们可以直接在java源代码中调用它们的功能。为了重现,我们有一个名为tiny的clojure项目,其中包含一个tiny.clj源文件。 tiny.clj文件包含以下代码:
(ns tiny
(:gen-class
:name com.domain.tiny
:methods [#^{:static true} [binomial [int int] double]]))
(defn binomial
"Calculate the binomial coefficient."
[n k]
(let [a (inc n)]
(loop [b 1
c 1]
(if (> b k)
c
(recur (inc b) (* (/ (- a b) b) c))))))
(defn -binomial
"A Java-callable wrapper around the 'binomial' function."
[n k]
(binomial n k))
(defn -main []
(println (str "(binomial 5 3): " (binomial 5 3)))
(println (str "(binomial 10042 111): " (binomial 10042 111)))
)
然后将其导出到ttt.jar文件中,然后将其添加到tinyJava项目的“Referenced Libraries”(这是一个java项目)。在tinyJava项目中有一个Main.java文件,它有以下代码:
import com.domain.tiny;
public class Main {
public static void main(String[] args) {
int j;
j = (int)tiny.binomial(5, 3);
System.out.println("(binomial 5 3): " + j);
System.out.println("(binomial 10042, 111): " + tiny.binomial(10042, 111));
}
}
然后输出:
(binomial 5 3): 10
(binomial 10042, 111): 4.9068389575068143E263
我的问题是,在Main.java中的以下几点:
j = (int)tiny.binomial(5, 3);
是否有可能进入clojure源代码?我试过了,但没用。
由于
[编辑]:我将jar添加到Referenced Libraries的方式如下:
1)右击项目tinyJava&选择属性
2)选择:Java Build Path
3)选择:图书馆
4)点击:“添加外部罐子”
5)然后转到ttt.jar
的位置[编辑2]:对于scala项目,似乎可以以稍微不同的方式实现这一点(见下文),其中一个链接项目而不是显式导出jar文件。
答案 0 :(得分:2)
例如,这似乎很容易用Scala做(注意下面的文章也讨论了互操作:How do you call Scala objects from Java?)。
我所做的如下:
1)设置名为firstScala的Scala项目,并使用以下代码添加文件MyPrinter.scala:
class MyPrinter{
def printTerm() {
print("hello");
}
}
2)然后我创建了一个名为firstScalaJava的Java项目,然后我使用以下代码添加了一个名为Main.java的文件:
class Main {
public static void main(String args[]) {
MyPrinter myPrint = new MyPrinter();
myPrint.printTerm();
}
}
3)然后我右键单击firstScalaJava,选择Properties,选择Java Build Path,选择Projects选项卡,单击“Add”,然后选择firstScala项目。
4)然后,如果我在“myPrint.printTerm();”处设置断点并且当调试器此时停止时单击F5,调试器会自动进入Scala源文件。
关于这个的好处是我不需要导出任何jar文件或类似的东西。这很有吸引力,因为在更改Scala代码时,不需要做任何事情(eclipse会在之后尝试运行java项目时自动重建scala项目),而如果我更改了Clojure代码,则需要重新导出jar等...(请注意,以上述方式链接项目不适用于clojure案例)