2010-06-16 15 views
6

Me gustaría incrustar el código de Clojure en Java. El sitio This fue útil en lo básico para configurar esto, pero el único argumento que pasa es de tipo String. He intentado usar ints también, y esos también funcionan.Pasando Args a Clojure desde Java

Mi pregunta es si hay alguna forma formateada para pasar datos estructurados a Clojure. En particular, tengo una lista de puntos que me gustaría transmitir a Clojure y se convierten en un vector que sería algo como esto:

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

¿Cuál es la forma más fácil de ir haciendo esto? ¿Hay un preprocesamiento que pueda hacer al final de Java, o debería hacer un postprocesamiento al final de Clojure, o hay algo en Clojure que pueda manejar esto? Sospecho que está pasando una Cadena de números y la longitud de cada tupla a Clojure, y dejar que procese la Cadena en un vector. Sin embargo, este aspecto de Clojure no tiene muchos ejemplos, y tengo curiosidad si me falta algo obvio.

EDIT: Mire la respuesta de mikera es que está interesado en pasar objetos de Java. Mire mi respuesta a continuación si solo desea formatear sus datos con anticipación en un formato Clojure para un conjunto/mapa/etc.

Respuesta

2

Depende, en primer lugar, del formato de sus datos, pero le resultará más fácil simplemente pasar el objeto Java que representa los datos directamente y leerlo utilizando las funciones de interoperabilidad Java de Clojure.

p. Ej. usted podría pasar una matriz de puntos de Java directamente y hacer algo como:

(let [point (aget some-array index)] 
    (do-stuff-with-point point)) 
+0

Bueno, no estoy del todo seguro de qué formato terminaré queriendo - en su mayoría es solo exploratorio en este momento. Su solución definitivamente funcionará mejor con Objects. –

1

Para aquellos casos cuando se desea pasar de una estructura de datos simple que ya ha formateado para parecerse a Clojure en Java, puede pasar en ese arg como una cuerda. Entonces para el ejemplo que di en mi pregunta, pasaría en

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

como mi arg. Cuando usted ha llamado Clojure usando invocar (arg), puede hacer que el primer paso de su función sea una llamada a readString en su arg:

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

Lo anterior producirá un vector cuando se pasa el ejemplo de cuerdas en.

Cuestiones relacionadas