如何从Java调用Clojure宏?

前端之家收集整理的这篇文章主要介绍了如何从Java调用Clojure宏?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有从 Java调用Clojure宏?

这是我正在努力做的:

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

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

我收到这个错误

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

解决方法

你必须用OutStr自己滚动.
  1. class YourClass {
  2. static final Var withBindings = RT.var("clojure.core","with-bindings*");
  3. static final Var list = RT.var("clojure.core","list*");
  4. static final Var out = RT.var("clojure.core","*out*");
  5. static final Var prxml = RT.var("clojure.contrib.prxml","prxml");
  6.  
  7. static String withOutStr(IFn f,Object args...) {
  8. StringWriter wtr = new StringWriter();
  9. withBindings.applyTo(list.invoke(RT.map(out,wtr),f,args));
  10. return wtr.toString();
  11. }
  12.  
  13. ...
  14.  
  15. String stringXML = withOutStr(prxml,"[:Name \"Bob\"]");
  16. }

猜你在找的Java相关文章