Отладка функций clojure, которые вызываются в Java-коде (eclipse) - PullRequest
4 голосов
/ 29 августа 2011

По следующей ссылке Вызов clojure из java , показано, как написать фрагмент кода clojure, функциональность которого мы можем затем вызывать непосредственно в исходном коде java. Для воспроизведения у нас есть проект clojure с именем tiny, в котором есть исходный файл 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? Я пытался, и это не сработало.

Спасибо

[РЕДАКТИРОВАТЬ]: я добавил банку в Библиотеки со ссылками следующим образом:

1) Щелкните правой кнопкой мыши на проекте tinyJava и выберите свойства

2) Выберите: Java Build Path

3) Выберите: Библиотеки

4) Нажмите: «Добавить внешние банки»

5) Затем перейдите в папку ttt.jar

[РЕДАКТИРОВАТЬ 2]: Похоже, что для проекта scala этого можно достичь несколько иным способом (см. Ниже), в котором можно связать проекты вместо явного экспорта файла jar.

1 Ответ

2 голосов
/ 30 августа 2011

Например, это кажется довольно простым для Scala (обратите внимание, что в следующей статье также обсуждается взаимодействие: Как вы называете объекты 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», выбрал вкладку «Проекты», нажал «Добавить», а затем выбрал первый проект Scala.

4) Тогда, если я поставлю точку останова на "myPrint.printTerm ();" и щелкнув F5, когда отладчик остановился в этот момент, он автоматически переходит в исходный файл Scala.

Приятно то, что мне не нужно было экспортировать jar-файлы или что-то подобное. Это привлекательно, потому что после изменения кода Scala не нужно ничего делать (eclipse автоматически перестраивает проект scala при попытке запустить проект java после этого), тогда как, если я изменил код Clojure, мне нужно будет повторно экспортировать jar и т. д. (обратите внимание, что связывание проектов описанным выше способом не работает для случая закрытия)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...