在R7RS方案中考虑以下宏定义:
(define-syntax foo
(syntax-rules ()
((_ bar)
(begin
(define baz 42)
(define-syntax bar
(syntax-rules ()
((_) baz)))))))
我已将此文件加载到chibi-scheme
的repl中并输入:
> (foo bar)
> (巴)
而不是预期的输出42
,我得到了:
错误:未定义的变量:baz
为什么会这样,如何将外部宏中baz
的定义值传递给内部宏?
答案 0 :(得分:1)
我在my test suite中支持语法规则的所有方案上运行此操作,并且仅在Chibi和MIT上失败。我没有看到它为什么不起作用的任何理由,但我承认,对我来说,宏观学仍然是一种黑色艺术。特别是,它适用于Foment,这是一个R7RS系统。我无法建立射手座,所以我无法在那里测试。
答案 1 :(得分:1)
这是chibi-scheme中的错误。宏定义需要捕获其环境;对于bar
,环境由bar
本身和baz
组成。然后,当您在另一个环境中展开bar
时,宏扩展需要识别baz
绑定在env-of-definition中。 chibi-scheme显然不承认实际定义了baz
。
此外,您在帖子中没有看到的另一个相关问题是,即使bar
的扩展将baz
识别为绑定,代码的加载/运行也需要查找baz
的值。
这是R6RS Ikarus计划:
> (define-syntax foo
(syntax-rules ()
((_ bar)
(begin
(define baz 42)
(define-syntax bar
(syntax-rules ()
((_) baz)))))))
> (foo bar)
> (bar)
42
>