如何从Java调用Clojure宏?

有没有从 Java调用Clojure宏?

这是我正在努力做的:

RT.var("clojure.core","require").invoke(Symbol.create("clojure.contrib.prxml"));
Var prxml = RT.var("clojure.contrib.prxml","prxml");
Var withOutStr = RT.var("clojure.core","with-out-str");
String stringXML = (String) withOutStr.invoke((prxml.invoke("[:Name \"Bob\"]")));

prxml默认写入* out *,这就是为什么我需要使用返回字符串的-out-str来包装宏.

我收到这个错误

[java] java.lang.IllegalArgumentException: Wrong number of args (1) passed to: core$with-out-str
 [java]     at clojure.lang.AFn.throwArity(AFn.java:437)
 [java]     at clojure.lang.RestFn.invoke(RestFn.java:412)
 [java]     at clojure.lang.Var.invoke(Var.java:365)
 [java]     at JavaClojure.xml.main(Unknown Source)

解决方法

你必须用OutStr自己滚动.
class YourClass {
    static final Var withBindings = RT.var("clojure.core","with-bindings*");
    static final Var list = RT.var("clojure.core","list*");
    static final Var out = RT.var("clojure.core","*out*");
    static final Var prxml = RT.var("clojure.contrib.prxml","prxml");

    static String withOutStr(IFn f,Object args...) {
        StringWriter wtr = new StringWriter();
        withBindings.applyTo(list.invoke(RT.map(out,wtr),f,args));
        return wtr.toString();
    }

    ...

    String stringXML = withOutStr(prxml,"[:Name \"Bob\"]");
}

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...