responsabilidad: Sé muy poco sobre clojure (mi experiencia ha sido con otros lenguajes funcionales y Java)
Mi instinto sin embargo dice que el problema es de alrededor prxml.invoke()
. La idea es que esa afirmación se evalúa demasiado pronto y envía el resultado a withOutStr (en lugar de dejar que withOutStr lo evalúe).
En cuanto a las fuentes en línea solo ... sobre todo RT, VarAFn &, así como el documento de clojure with-out-str me gustaría probar algo en la línea de:
String stringXML = (String) withOutStr.invoke(RT.list(prxml,"[:Name \"Bob\"]"));
Editar: También sospecharía que es capaz de llamar macros clojure desde Java, de lo contrario la función isMacro() en Var parece bastante tonta ...
Editar 2: descargué clojure, y lo probé ... no funciona, así que ignóralo por ahora.
Datos 3: con-out-str aparentemente requiere 2 parámetros así:
final Cons consXML = (Cons) withOutStr.invoke(prxml, RT.list("[:Name \"Bob\"]"));
final Object[] objs = RT.seqToArray(consXML);
System.out.println(Arrays.toString(objs));
tiene una potencia de: [clojure.core/let, [s__4095__auto__ (new java.io.StringWriter)], (clojure.core/binding [clojure.core/*out* s__4095__auto__] (clojure.core/str s__4095__auto__))]
Me pregunto si eso va a evaluar en algo útil, o no (no estoy seguro si estoy correcto en los enlaces, tengo que descubrir cómo evaluar los inconvenientes a través de Java.
Editar 4: examinando el compilador y más código, parece que las macros tienen realmente 2 parámetros ocultos. Véase the commit 17a8c90
Copiar el método en el compilador que tengo:
final ISeq form = RT.cons(withOutStr, RT.cons(prxml, RT.cons("[:Name \"Bob\"]", null)));
final Cons consXML = (Cons) withOutStr.applyTo(RT.cons(form, RT.cons(null, form.next())));
System.out.println(consXML.toString());
// Output: (clojure.core/let [s__4095__auto__ (new java.io.StringWriter)] (clojure.core/binding [clojure.core/*out* s__4095__auto__] #'clojure.contrib.prxml/prxml "[:Name \"Bob\"]" (clojure.core/str s__4095__auto__)))
que parece un poco más prometedor, pero todavía requiere la evaluación de la expresión dejar que parece tener un caso especial en el compilador.
¿Se puede invocar una macro desde Java? No sé mucho sobre Clojure, pero en Lisp, el lector evalúa las macros antes de compilar el código. Si Clojure es de la misma manera, entonces llamar desde Java puede ser demasiado tarde. ¿Cuándo se amplían las macros en Clojure? –
Sí, puede invocar macros Clojure desde Java pero necesita invocar el lector Clojure (para que el compilador se llame y expanda la macro), no la función específica (¡ya que una función ya está compilada!). Puede valer la pena revisar las respuestas a esta pregunta: http://stackoverflow.com/questions/2181774/calling-clojure-from-java – mikera
mikera, creo que estás en algo. Me pregunto si hay una buena manera de llamar al lector clojure en una macro en Java. – mudge