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

4

На следующей ссылке Вызов 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.

  • 0
    Что вы имеете в виду под «шагом»? Ты имеешь ввиду пройтись с отладчиком?
  • 0
    @McOmghall Да. Благодарю.
Теги:
debugging
clojure

1 ответ

2
Лучший ответ

Например, это довольно легко сделать с 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню