Передача аргументов Clojure из Java - PullRequest
6 голосов
/ 16 июня 2010

Я хотел бы встроить код Clojure в Java. Этот сайт был полезен в основах его настройки, но единственный аргумент, который он когда-либо передает, имеет тип String. Я тоже попробовал использовать int, и они тоже работают.

Мой вопрос заключается в том, существует ли какой-либо форматированный способ передачи структурированных данных в Clojure. В частности, у меня есть список точек, которые я хотел бы передать Clojure и превратить в вектор, который будет выглядеть примерно так:

[[1 2] [3 4] [5 6]]

Какой самый простой способ сделать это? Есть ли предварительная обработка, которую я могу выполнить на стороне Java, или я должен выполнить постобработку на конце Clojure, или в Clojure есть что-то, что справится с этим? Я подозреваю, что он передает строку чисел и длину каждого кортежа в Clojure и позволяет ему обработать строку в вектор. Тем не менее, этот аспект Clojure не имеет много примеров, и мне любопытно, если я упускаю что-то очевидное.

РЕДАКТИРОВАТЬ: Пожалуйста, посмотрите на ответ Микера, вы заинтересованы в передаче Java-объектов. Пожалуйста, посмотрите на мой ответ ниже, если вы просто хотите заранее отформатировать данные в формате Clojure для набора / карты / и т. Д.

Ответы [ 2 ]

2 голосов
/ 16 июня 2010

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

(let [point (aget some-array index)]
  (do-stuff-with-point point))
1 голос
/ 16 июня 2010

В тех случаях, когда вы хотите передать простую структуру данных, которую вы уже отформатировали, чтобы она выглядела как Clojure в Java, вы можете передать этот аргумент в виде строки. Так что для примера, который я привел в своем вопросе, я бы передал в

"[[1 2] [3 4] [5 6]]"

как мой аргумент. Когда вы вызываете Clojure с помощью invoke (arg), вы можете сделать первый шаг вашей функции вызовом readString для вашего arg:

(defn foo [d]
  (def data (read-string d)))

Приведенный выше пример создаст вектор при передаче примера String.

...