首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的(guile)方案宏评估它的论点?

为什么我的(guile)方案宏评估它的论点?
EN

Stack Overflow用户
提问于 2021-09-28 04:17:58
回答 1查看 104关注 0票数 1

在Guile中,我正在尝试学习define-syntaxsyntax-rules。我的印象是,方案宏不评估它们的论点,但我的宏似乎是这样做的:

代码语言:javascript
复制
(define-syntax foo
    (syntax-rules ()
        ((foo word)
            (if (eqv? word 'bar) (begin (write "Caller said BAR!") (newline)))
            )))

如果我用(foo bar)调用它,我会得到错误消息

未绑定变量: bar

然而,如果我用(foo 'bar)调用它,我就得到了预期的

“呼叫者说吧!”

这使它看起来似乎是在宏应用之前对参数进行评估。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-28 04:41:02

首先,您应该试着看看宏扩展是什么:

代码语言:javascript
复制
scheme@(guile-user)> (use-modules (language tree-il))
scheme@(guile-user)> (tree-il->scheme (macroexpand '(foo bar)))

缩进编辑以提高清晰度

代码语言:javascript
复制
(if ((@@ (#{ g184}#) eqv?) bar (quote bar))
    (begin ((@@ (#{ g184}#) write) "Caller said BAR!")
       ((@@ (#{ g184}#) newline))))

因此,(foo bar)被转换为(在移除@@s之后):

代码语言:javascript
复制
(if (eqv? bar (quote bar))
    (begin (write "Caller said BAR!")
       (newline)))

在进行评估之前。现在这个错误是有意义的,不是吗?

现在,如果引用word参数会发生什么?看看它是如何扩展的:

代码语言:javascript
复制
(define-syntax foo
  (syntax-rules ()
    ((foo word)
     (if (eqv? 'word 'bar) (begin (write "Caller said BAR!") (newline))))))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69355751

复制
相关文章

相似问题

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