【发布时间】:2011-10-04 02:46:11
【问题描述】:
是否可以从 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*,这就是为什么我需要用返回字符串的宏 with-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)
【问题讨论】:
-
你能从 Java 中调用宏吗?我对 Clojure 了解不多,但在 Lisp 中,宏在编译代码之前由读者评估。如果 Clojure 也是这样,那么从 Java 调用可能为时已晚。 Clojure 中的宏何时扩展?
-
是的,您可以从 Java 调用 Clojure 宏,但您需要调用 Clojure 读取器(以便调用编译器并扩展宏),而不是特定函数(因为函数已经编译! )。可能值得查看这个问题的答案:stackoverflow.com/questions/2181774/calling-clojure-from-java
-
mikera,我想你在做点什么。我想知道是否有一种好方法可以在 Java 中的宏上调用 clojure 阅读器。
标签: java clojure clojure-contrib