Отказ от ответственности: я очень мало знаю о clojure (мой опыт работы с другими функциональными языками и Java)
Мой инстинкт кишки, однако, говорит, что проблема в prxml.invoke()
. Здесь мысль состоит в том, что этот оператор вычисляется слишком рано и отправляет результат в withOutStr (вместо того, чтобы позволить withOutStr оценивать его).
Глядя только на источники в сети ... особенно RT , Var & AFn , а также документ clojure для без str Я бы попробовал что-то вроде:
String stringXML = (String) withOutStr.invoke(RT.list(prxml,"[:Name \"Bob\"]"));
Редактировать: Также я подозреваю, что он может вызывать макросов clojure из Java, в противном случае функция isMacro () в Var выглядит довольно глупо ...
Редактировать 2: Скачал clojure и попробовал его ... не работает, так что игнорируйте это сейчас.
Редактировать 3: with-out-str, очевидно, требуется 2 параметра, поэтому:
final Cons consXML = (Cons) withOutStr.invoke(prxml, RT.list("[:Name \"Bob\"]"));
final Object[] objs = RT.seqToArray(consXML);
System.out.println(Arrays.toString(objs));
имеет вывод: [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__))]
Интересно, оценит ли это что-нибудь полезное или нет (не уверен, что я правильно опишу привязки, придется выяснить, как оценивать минусы через Java.
Редактировать 4: пробираясь через компилятор и больше кода, кажется, что у макросов действительно есть 2 скрытых параметра См коммит 17a8c90
Копирование метода в компилятор у меня:
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__)))
Это выглядит немного более многообещающе, но все же требует оценки выражения let, которое, похоже, имеет особый случай в компиляторе.