1

这是我的小程序:

(let-syntax ((alpha (lambda (x)
                      (list (syntax quote)
                            (list)))))
  (alpha))

guile 执行它,并返回 ()。但 mit-scheme 输出以下内容:

;Syntactic binding value must be a keyword: alpha
;To continue, call RESTART with an option number:
; (RESTART 1) => Return to read-eval-print level 1.

为什么?

(我的版本是:版本 9.1 || 微码 15.3 || 运行时 15.7 || SF 4.41 || LIAR/i386 4.118 || Edwin 3.116)

4

2 回答 2

1

您链接到的文档明确表明您绝对必须将语法规则与 let-syntax 一起使用。这是确切的语法契约。

    <macro block> ==>
          (let-syntax (<syntax spec>*) <body>)
         | (letrec-syntax (<syntax spec>*) <body>)
    <syntax spec> ==> (<keyword> <transformer spec>)
    <transformer spec> ==>
          (syntax-rules (<identifier>*) <syntax rule>*)

根据规范,不能期望使用除语法规则之外的任何内容都不会出错。这会在 MIT Scheme 而不是在 Guile 中产生错误的唯一原因是因为 MIT Scheme 更多地应用异常(即 MIT Scheme 的 let-syntax 专门寻找确保您给它提供了语法规则)。它根本不是有效的 R4RS 代码,并且不应该在任何 R4RS 兼容的方案实现中工作。

于 2012-11-10T06:19:11.333 回答
1

MIT 方案仅提供syntax-rules语法闭包和显式重命名来定义语法转换器。对于后两者,您需要其中一个sc-macro-transformerer-macro-transformer表单。如果要使用语法对象,则需要使用支持语法对象(通常附带syntax-case)的实现,例如RacketGuile

顺便说一句,即使在具有语法对象的语言中,您的宏定义也可能不起作用,因为您从转换器返回列表而不是语法。此外,您链接到的网页是一个非常古老的标准。您可能想阅读有关宏的更新源,例如TSPL4

于 2012-11-10T23:37:33.407 回答