考虑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
值传递给内部宏?
发布于 2013-12-31 11:46:49
这是奇比方案中的一个错误.宏定义需要捕获其环境;对于bar
,环境由bar
本身和baz
组成。然后,当您在另一个环境中展开bar
时,宏展开需要认识到baz
被绑定在定义的env中。chibi-方案显然不承认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
>
发布于 2013-12-31 11:06:43
我在我的测试套件中支持语法规则的所有方案上都运行了这个程序,而且它只在Chibi和MIT上失败。我看不出有什么理由不应该这样做,但我承认,对我来说,宏观学仍然是一门黑色的艺术。特别地,它工作在Foment,这是一个R7RS系统。我没有能力建造射手座,所以我不能在那里测试它。
https://stackoverflow.com/questions/20858053
复制