考虑R7RS方案中的以下宏定义:
(define-syntax foo
(syntax-rules ()
((_ bar)
(begin
(define baz 42)
(define-syntax bar
(syntax-rules ()
((_) baz)))))))
我已将此文件加载到 chibi-scheme
的 repl 中并输入:
> (foo bar)
> (bar)
我得到的不是预期的输出42
,而是:
ERROR: undefined variable: baz
为什么会这样?如何将外部宏中定义的 baz
值传递给内部宏?
最佳答案
这是赤壁方案中的一个错误。宏定义需要捕获它的环境;对于 bar
来说,环境由 bar
本身和 baz
组成。然后,当您在另一个环境中扩展 bar
时,宏扩展需要识别 baz
绑定(bind)在 env-of-definition 中。 chibi-scheme 显然无法识别 baz
实际上已定义。
此外,您在帖子中没有看到的另一个相关问题是,即使 bar
的扩展将 baz
识别为绑定(bind),加载/运行代码需要找到baz
的值。
这是 R6RS Ikarus 方案:
> (define-syntax foo
(syntax-rules ()
((_ bar)
(begin
(define baz 42)
(define-syntax bar
(syntax-rules ()
((_) baz)))))))
> (foo bar)
> (bar)
42
>
关于macros - 方案:将宏定义内部的定义传递给子宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20858053/