На следующей ссылке Вызов clojure из java показано, как написать кусок кода clojure, функциональность которого мы можем затем вызвать непосредственно в java исходный код. Для воспроизведения у нас есть проект 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 (который представляет собой проект 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? Я пробовал, и это не сработало.
Спасибо
[EDIT]: как я добавил банку в ссылочные библиотеки, было следующее:
1) Rightclick на проекте tinyJava и выберите свойства
2) Выберите: путь сборки Java
3) Выберите: Библиотеки
4) Нажмите "Добавить внешние банки"
5) Затем перейдите к местоположению ttt.jar
[EDIT 2]: для проекта scala кажется, что можно добиться этого несколько иначе (см. ниже), в результате чего вы связываете проекты, а не явно экспортируете файл jar.
Например, это довольно легко сделать с Scala (обратите внимание, что в следующей статье также обсуждается interop: Как вы вызываете Scala объекты из Java?).
Я сделал следующее:
1) Настройте проект Scala под названием firstScala и добавьте файл MyPrinter.scala со следующим кодом:
class MyPrinter{
def printTerm() {
print("hello");
}
}
2) Затем я создал проект Java под названием firstScalaJava, к которому я добавил файл Main.java со следующим кодом:
class Main {
public static void main(String args[]) {
MyPrinter myPrint = new MyPrinter();
myPrint.printTerm();
}
}
3) Затем я нажал правой кнопкой мыши на firstScalaJava, выбрал "Свойства", выбрал "Путь сборки Java", выбрал вкладку "Проекты", нажал "Добавить" и затем выбрал проект firstScala.
4) Затем, если я поставил точку останова на "myPrint.printTerm();" и нажал F5, когда отладчик остановился на этом этапе, отладчик автоматически переходит в исходный файл Scala.
Хорошая вещь в том, что мне не нужно было экспортировать файлы jar или что-то в этом роде. Это привлекательно, потому что при изменении кода Scala ничего не нужно делать (eclipse автоматически перестраивает проект Scala при попытке запустить Java-проект после этого), тогда как если бы я изменил код Clojure, мне понадобилось бы для реэкспорта контейнера и т.д. (обратите внимание, что связывание проектов описанным выше способом не работает для случая Clojure)