Передача Args к Clojure от Java

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

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

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

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

Править: Посмотрите на ответ mikera, Вы интересуетесь мимоходом Объектами Java. Посмотрите на мой ответ ниже, если Вы просто хотите отформатировать свои данные заранее в формат Clojure для набора/карты/и т.д.

6
задан cryptic_star 28 June 2010 в 14:18
поделиться

2 ответа

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

например. вы можете передать массив точек Java напрямую и сделать что-то вроде:

(let [point (aget some-array index)]
  (do-stuff-with-point point))
2
ответ дан 17 December 2019 в 18:10
поделиться

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

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

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

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

Вышеупомянутое приведет к созданию вектора при передаче примера String.

1
ответ дан 17 December 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: