2

考虑 R7RS 方案中的以下宏定义:

(define-syntax foo
  (syntax-rules ()
    ((_ bar)
      (begin
        (define baz 42)
        (define-syntax bar
          (syntax-rules ()
            ((_) baz)))))))

我已将此文件加载到 repl 中chibi-scheme并输入:

>(富吧)

>(酒吧)

而不是预期的输出42,我得到:

错误:未定义的变量:baz

为什么会这样?如何baz将外部宏中定义的值传递给内部宏?

4

2 回答 2

1

我已经在我的测试套件中支持语法规则的所有方案上运行了这个,它只在 Chibi 和 MIT 上失败。我看不出它不应该起作用的任何理由,但我承认宏观学对我来说仍然是一门黑色艺术。特别是,它可以在作为 R7RS 系统的 Foment 中运行。我无法建造射手座,所以我无法在那里进行测试。

于 2013-12-31T19:06:43.983 回答
1

这是 chibi-scheme 中的错误。宏定义需要捕捉其环境;因为bar环境由bar自身和组成baz。然后当你bar在另一个环境中展开时,宏展开需要识别bazenv-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
> 
于 2013-12-31T19:46:49.007 回答