Macros 方案:将宏定义内的定义传递给子宏?

Macros 方案:将宏定义内的定义传递给子宏?,macros,scheme,r7rs,chibi-scheme,Macros,Scheme,R7rs,Chibi Scheme,考虑R7RS方案中的以下宏定义: (define-syntax foo (syntax-rules () ((_ bar) (begin (define baz 42) (define-syntax bar (syntax-rules () ((_) baz))))))) 我已将此文件加载到赤壁方案的repl中,并输入: >(富吧) >(巴) 我得到的不是预期的输出42,而是: 错误:未定义变量

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

(define-syntax foo
  (syntax-rules ()
    ((_ bar)
      (begin
        (define baz 42)
        (define-syntax bar
          (syntax-rules ()
            ((_) baz)))))))
我已将此文件加载到
赤壁方案的repl中,并输入:

>(富吧)

>(巴)

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

错误:未定义变量:baz


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

我已经在所有支持语法规则的方案上运行了此操作,但仅在Chibi和MIT上失败。我看不出有什么理由它不起作用,但我承认,宏观学对我来说仍然是一门黑色艺术。特别是,它在Foment中工作,这是一个R7RS系统。我还不能建造人马座,所以我不能在那里测试它。

这是赤壁计划中的一个错误。宏定义需要捕获其环境;对于
bar
而言,环境由
bar
本身和
baz
组成。然后,当您在另一个环境中展开
bar
时,宏展开需要识别
baz
绑定在定义的环境中。chibi方案显然不承认实际上定义了
baz

此外,另一个相关的问题是,即使扩展
baz
识别为绑定,代码的加载/运行也需要找到
baz
的值

以下是R6RS Ikarus方案:

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

在球拍中工作正常。在哪种兼容模式下?我尝试了两种
#!r6rs
#lang racket
。张贴在chibi scheme邮件列表上,查看chibi scheme是否存在错误。作者已确认这是chibi scheme中的错误。这个错误已经修复了!