Интеграция Clojure в существующий проект Java? - PullRequest
13 голосов
/ 02 февраля 2010

Как я могу взять большой существующий Java-проект и начать добавлять модули Clojure? Например, в приведенном ниже коде я хотел бы сделать следующие функции доступными в Java: state ?, zip ?, state-list, zipcode-list . Два предиката вернут логическое значение, но «получатели» вернут массивы.

(def *states* (list "NJ" "NY" "CA"))
(def *zipcodes*  (list 12345 54343 98765))

(defn member [x sq]
  (if (seq sq)
    (if (= x (first sq))
      sq
      (recur x (rest sq)))))

(defn <strong>state?</strong> [aState]
  (not (= (member aState *states*) nil)))

(defn <strong>zip?</strong> [aZip]
  (not (= (member aZip *zipcodes*) nil)))

(defn <strong>state-list</strong> []
  *states*)

(defn <strong>zipcode-list</strong> []
  *zipcodes*)
;; ---------------
(state? "AA")
(state? "CA")
(zip? 11111)
(zip? 12345)

Ответы [ 3 ]

11 голосов
/ 02 февраля 2010

Я бы скомпилировал его, используя leininge n, а затем добавьте файл jar в мой проект java как сборку dep. , тогда вы бы позвонили прямо из Java. У Leiningen есть опция uberjar, которая учитывает clojure и все ваши зависимости clojure, поэтому вам нужно беспокоиться только об одном файле. Мне нравится это, потому что его меньше работы.

Более дружественный к Java подход - добавить муравьиную задачу для его сборки вместе с Java-проектом, просто немного больше работы

для функций, которые должны возвращать правильные массивы Java, вызовите to-array для них

В отличие от многих хитов "вызов clojure из java", вам не нужно вызывать RT времени выполнения clojure.

PS: мой любимый тэг "Я хотел бы использовать библиотеку Java под названием clojure". Я спросил Рича, что он сказал, что это круто;)

2 голосов
/ 04 мая 2013

Мой рекомендуемый подход следующий:

  • Продолжайте управлять Java-проектом, используя основной инструмент сборки (предположительно, Maven?)
  • Добавить Clojure в качестве зависимости. Он будет работать как любая другая библиотека .jar file
  • Позвоните в код Clojure из Java. Типичный вариант использования: require пространство имен, чтобы сделать это, получить ссылку на любой IFn, который вы хотите вызвать, и вызвать функцию через IFn.invoke

Я рекомендую этот подход, потому что обычно проще добавить Clojure в проект Java, а не наоборот: это особенно верно, если у вас есть другие разработчики, которые рассматривают или используют инструменты, которые предполагают обычный проект Java. Это также не так страшно для менеджеров: все, что вы делаете, это используете дополнительную маленькую библиотеку Java: -)

Я создал небольшую служебную библиотеку, которая выполняет большую часть работы, необходимой для вызова Clojure из Java, которая может оказаться вам полезной:

2 голосов
/ 02 февраля 2010

Проще взять существующее приложение Java и обернуть его в Clojure, чем наоборот, потому что взаимодействие с Java из Clojure очень просто.

Когда вы спрашиваете, как получить доступ к Clojure из Java, ответ таков: вам нужно либо загрузить загрузочный код Clojure, либо вам нужно сгенерировать файлы классов Java, которые можно использовать из вашего проекта Java. Самозагрузка включает в себя ссылку на банку clojure и доступ к функции загрузки для загрузки источника clojure. Для генерации классов Java загляните в AOT (см. Пример на веб-сайте).

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