Подтвердить что ты не робот

Интеграция Clojure в существующий проект Java?

Как я могу взять большой существующий проект 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 state? [aState]
  (not (= (member aState *states*) nil)))

(defn zip? [aZip]
  (not (= (member aZip *zipcodes*) nil)))

(defn state-list []
  *states*)

(defn zipcode-list []
  *zipcodes*)
;; ---------------
(state? "AA")
(state? "CA")
(zip? 11111)
(zip? 12345)
4b9b3361

Ответ 1

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

Другим подходом, основанным на java, было бы добавить задачу ant для ее создания вместе с java-проектом, это просто немного больше работы

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

вопреки многим "верхним" вызовам clojure из java ", вам не нужно будет вызывать RTM clojure.

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

Ответ 2

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

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

Ответ 3

Мой рекомендуемый подход заключается в следующем:

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

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

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