clojure - 如何在 Clojure 宏的词法范围内捕获?

标签 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 中定义类似的宏时,它会在 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/

相关文章:

clojure - 我如何确定正确的文件系统路径

引用ggplot函数的 'data'参数中传入的数据框的一个变量

javascript - 另一个 javascript 函数作用域问题

clojure 类型转换字符串到符号

tomcat - Compojure:访问文件系统

recursion - 使用 Spectre 递归地改变 map 中的值

javascript - jQuery 提交不处理 "success"

javascript - Django 模板变量在脚本标签中无法识别,但在常规 h1 标签中可识别。是什么原因造成的?

dynamic - Lisp 动态作用域 : A powerful short example reasoning it?

javascript - javascript对象文字中的事件处理程序