Как вызвать код Clojure из Java - PullRequest
3 голосов
/ 28 марта 2011

Мой профессор позволил мне практиковать и Clojure, и Java!Я определенно использую эту возможность и хочу, чтобы мое первое назначение на Java вызвало некоторый код Clojure.Прежде чем перейти к фактическому заданию, я хочу создать простой, рабочий пример.Мне нужна ваша помощь.

Я прочитал несколько ссылок на совместимость Java / Clojure. Это и Это .

Я буду использовать первую ссылку для демонстрации того, что я сделал до сих пор:

1) Я создалClojure Project, сбросил файл .cli с сайта и использует функцию экспорта в Eclipse, чтобы экспортировать его как .jar в папку в моем каталоге Documents.

2) Я создал второй проект Java, сбросил в него файл java и добавил clojure.jar в качестве библиотеки, на которую есть ссылки.

Закрытие ns:

(ns com.tiny
  (:gen-class
   :name com.tiny
   :methods [#^{:static true} [binomial [int int] double]]))

Импорт Java:

import com.tiny;

Файл Java не распознает com.tiny.Я не знаю почему.На сайтах упоминается что-то о пути к классам.Итак, я нашел редактор пути к классам в eclipse и добавил нужную папку с .jar в список путей.Это также не сработало.

Я не знаю, что я делаю не так.Я сослался на jar-файл, добавил его в путь к классам и выполнил полное копирование-вставку кода в первой ссылке (кроме имени пакета).

Java-код:

import com.tiny;

public class Main {

public static void main(String[] args) {
    System.out.println("(binomial 5 3): " + tiny.binomial(5, 3));
    System.out.println("(binomial 10042, 111): " + tiny.binomial(10042, 111));
    }
}

Код закрытия:

(ns com.tiny
  (:gen-class
   :name com.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)))
)

Ответы [ 2 ]

4 голосов
/ 28 марта 2011

Чтобы успешно запустить ваш пример, я сделал следующее:

1) Создал проект Clojure в Eclipse 2) Добавил файл tiny.clj в src / com / tiny.clj 3) Экспортировал этопроект в виде файла .jar (например, tiny.jar)

4) Создан проект Java, как вы описали, с одним файлом Java - Main.java 5) Добавьте clojure.jar и tiny.jar в Javaпуть к классу проекта.(Щелкните правой кнопкой мыши -> Настроить путь сборки -> Вкладка «Библиотеки» -> Добавить внешние JAR-файлы)

Когда я впервые попробовал это, я не поместил файл tiny.clj в каталог com / (он у меня был)непосредственно в src /), и я получил RuntimeException, когда попытался запустить класс Main, в котором говорилось, что файлы tiny.clj и tiny__init.class не найдены.Перемещение файла tiny.clj в подкаталог com / решило проблему для меня и Main rain успешно.

1 голос
/ 03 января 2013

Дополнительная ссылка, которая может помочь по этому вопросу:

Библиотека clojure-utils содержит код, необходимый для эффективного вызова Clojure из Java (без сложности использования подхода gen-class)

...