在Common中,我可以定义和使用从词法范围捕获变量的宏,以便在let表单中使用它:
CL-USER> (defmacro plus9 () `(+ 9 woo))
PLUS9
CL-USER> (macroexpand '(plus9))
(+ 9 WOO)
T
CL-USER> (let ((woo 1)) (plus9))
10但是,当我在Clojure中定义类似的宏时,它将在user命名空间中寻找user的定义:
user=> (defmacro plus9 [] `(+ 9 woo))
#'user/plus9
user=> (macroexpand '(plus9))
(clojure.core/+ 9 user/woo)
user=> (let [woo 1] (plus9))
CompilerException java.lang.RuntimeException: No such var: user/woo显然,我误解了Clojure中的范围是如何工作的。用Clojure实现这个宏的正确方法是什么?
发布于 2015-11-02 09:06:21
我是个大菜鸟,但不如
user=> (defmacro plus9 [] `(+ 9 ~'woo))
#'user/plus9
user=> (macroexpand '(plus9))
(clojure.core/+ 9 woo)
user=> (let [woo 1] (plus9))
10https://stackoverflow.com/questions/33471659
复制相似问题