首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案:将内部宏定义传递给子宏?

方案:将内部宏定义传递给子宏?
EN

Stack Overflow用户
提问于 2013-12-31 13:21:38
回答 2查看 265关注 0票数 2

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

代码语言:javascript
复制
(define-syntax foo
  (syntax-rules ()
    ((_ bar)
      (begin
        (define baz 42)
        (define-syntax bar
          (syntax-rules ()
            ((_) baz)))))))

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

(foo bar) (酒吧)

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

错误:未定义变量: baz

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-31 19:46:49

这是奇比方案中的一个错误.宏定义需要捕获其环境;对于bar,环境由bar本身和baz组成。然后,当您在另一个环境中展开bar时,宏展开需要认识到baz被绑定在定义的env中。chibi-方案显然不承认baz实际上是定义的.

另外,您在文章中没有看到的另一个相关问题是,即使bar的扩展承认baz是绑定的,代码的加载/运行也需要找到baz的值。

以下是R6RS Ikarus计划:

代码语言:javascript
复制
> (define-syntax foo
  (syntax-rules ()
    ((_ bar)
      (begin
        (define baz 42)
        (define-syntax bar
          (syntax-rules ()
            ((_) baz)))))))
> (foo bar)
> (bar)
42
> 
票数 1
EN

Stack Overflow用户

发布于 2013-12-31 19:06:43

我在我的测试套件中支持语法规则的所有方案上都运行了这个程序,而且它只在Chibi和MIT上失败。我看不出有什么理由不应该这样做,但我承认,对我来说,宏观学仍然是一门黑色的艺术。特别地,它工作在Foment,这是一个R7RS系统。我没有能力建造射手座,所以我不能在那里测试它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20858053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档