免責事項: 私は clojure についてほとんど知りません (私の経験は他の関数型言語と Java でした)。
しかし、私の本能は、問題は周りにあると言いprxml.invoke()
ます。ここで考えられるのは、そのステートメントの評価が早すぎて、(withOutStr に評価させる代わりに) 結果を withOutStr に送信するということです。
ソースをオンラインで単独で見ると...特にRT、Var & AFn 、およびwith-out-strの clojure doc を見ると、次の行に沿って何かを試してみます。
String stringXML = (String) withOutStr.invoke(RT.list(prxml,"[:Name \"Bob\"]"));
編集: また、java から clojure マクロを呼び出すことができると思われます。それ以外の場合、Var の isMacro() 関数はかなりばかげているようです...
編集 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 式の評価が必要です。