在 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 中定义类似的宏时,它会在 user
命名空间中查找 woo
的定义:
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 实现此宏的正确方法是什么?
最佳答案
我是一个宏菜鸟,但是怎么样
user=> (defmacro plus9 [] `(+ 9 ~'woo))
#'user/plus9
user=> (macroexpand '(plus9))
(clojure.core/+ 9 woo)
user=> (let [woo 1] (plus9))
10
关于clojure - 如何在 Clojure 宏的词法范围内捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33471659/