语法绑定值必须是关键字:alpha。这是什么意思?

时间:2012-10-28 16:55:35

标签: lisp scheme mit-scheme

这是我的小程序:

(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.

为什么?

(我的版本是:Release 9.1 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR / i386 4.118 || Edwin 3.116)

2 个答案:

答案 0 :(得分:1)

您链接的文档明确证明您必须使用带语法的语法规则。这是确切的句法合同。

    <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兼容的Scheme实现中工作。

答案 1 :(得分:1)

MIT Scheme仅提供syntax-rules,语法闭包和显式重命名以定义语法变换器。对于后两者,您需要sc-macro-transformerer-macro-transformer表单。如果要使用语法对象,则需要使用支持语法对象的实现(通常伴随syntax-case),例如RacketGuile

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