clojurescript 中的嵌套宏
在一个文件中,我定义了这两个宏:
(ns macros)
(defmacro foo [a]
`(+ ~a 2))
(defmacro bar [a]
`(* 2 (foo ~a)))
在 clojure 中,这两个宏都按预期工作。
在 clojurescript 中,只有宏“foo”起作用,“bar”产生此错误:
"Error evaluating:" (bar 0) :as "(2 * macros.foo.call(null,0));\n"
org.mozilla.javascript.EcmaError: ReferenceError: "macros" is not defined. (<cljs repl>#4)
at <cljs repl>:4 (anonymous)
at <cljs repl>:4
似乎这里“foo”宏没有扩展,而是解释为函数调用。
这是 clojurescript 中的错误还是我做错了什么?
In a file i define these 2 macros:
(ns macros)
(defmacro foo [a]
`(+ ~a 2))
(defmacro bar [a]
`(* 2 (foo ~a)))
In clojure both macros work as intended.
In clojurescript only the macro "foo" works, "bar" produces this error:
"Error evaluating:" (bar 0) :as "(2 * macros.foo.call(null,0));\n"
org.mozilla.javascript.EcmaError: ReferenceError: "macros" is not defined. (<cljs repl>#4)
at <cljs repl>:4 (anonymous)
at <cljs repl>:4
It seems that here the "foo" macro gets not expanded but interpreted as a function call.
Ist this a bug in clojurescript or did i something wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我相信您在这里看到的问题是由于宏文件的单个元素命名空间造成的。如果将其更改为 util.macros 并将其放在类路径上的适当位置以解决此问题,它就可以工作。
可能是一个错误,因为它在 Clojure 中运行没有问题。
I believe the issue you're seeing here is due to the single element namespace for the macros file. If you change it to util.macros and put in the proper place on the classpath to account for that, it works.
Probably a bug given it works without issue in Clojure.