macros - 方案:将宏定义内部的定义传递给子宏?

标签 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)

> (bar)

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

ERROR: undefined variable: baz

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

最佳答案

这是赤壁方案中的一个错误。宏定义需要捕获它的环境;对于 bar 来说,环境由 bar 本身和 baz 组成。然后,当您在另一个环境中扩展 bar 时,宏扩展需要识别 baz 绑定(bind)在 env-of-definition 中。 chibi-scheme 显然无法识别 baz 实际上已定义。

此外,您在帖子中没有看到的另一个相关问题是,即使 bar 的扩展将 baz 识别为绑定(bind),加载/运行代码需要找到baz的值。

这是 R6RS Ikarus 方案:

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

关于macros - 方案:将宏定义内部的定义传递给子宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20858053/

相关文章:

scheme - Chibi Scheme - 简单的定义库示例不起作用

macros - SAS 宏错误 : More positional parameters found than defined

c++ - 为什么这个宏会产生 2?

random - 在Scheme中,你如何做概率?

macros - 诡计在 Racket 中的程序来源?

scheme r7rs-large 有趣但是...它还在进行中吗?

macros - 方案:定义和定义语法规则之间的区别

c++ - 清理 C/C++ 代码揭示可变参数宏的问题

functional-programming - Clojure 中的延续

module - Scheme库被*加载*意味着什么? Scheme库什么时候*加载*?