Scheme:传递定义内部宏定义到submacro?

时间:2013-12-31 13:21:39

标签: macros scheme r7rs chibi-scheme

在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的定义值传递给内部宏?

2 个答案:

答案 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
>