如何在Clojure宏中捕获词法范围?

时间:2015-11-02 06:06:53

标签: clojure scope

在Common Lisp中,我可以定义并使用一个从词法范围捕获变量的宏,这样我就可以在let形式中使用它:

CL-USER> (defmacro plus9 () `(+ 9 woo))
PLUS9
CL-USER> (macroexpand '(plus9))
(+ 9 WOO)
T
CL-USER> (let ((woo 1)) (plus9))
10

但是,当我在Clojure中定义一个类似的宏时,它正在寻找woo命名空间中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实现这个宏的正确方法是什么?

1 个答案:

答案 0 :(得分:8)

我是一个宏菜鸟,但是怎么样

user=> (defmacro plus9 [] `(+ 9 ~'woo))
#'user/plus9
user=> (macroexpand '(plus9))
(clojure.core/+ 9 woo)
user=> (let [woo 1] (plus9))
10