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

Lisp 语法绑定值必须是关键字:alpha。这是什么意思?,lisp,scheme,mit-scheme,Lisp,Scheme,Mit Scheme,这是我的小程序: (let-syntax ((alpha (lambda (x) (list (syntax quote) (list))))) (alpha)) guile执行它,并返回()。但麻省理工学院的方案输出如下: ;Syntactic binding value must be a keyword: alpha ;To continue, call RESTART with an

这是我的小程序:

(let-syntax ((alpha (lambda (x)
                      (list (syntax quote)
                            (list)))))
  (alpha))
guile执行它,并返回()。但麻省理工学院的方案输出如下:

;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 | | |撒谎者/i386 4.118 | | |埃德温3.116)

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

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

根据规范,使用语法规则以外的任何东西都不可能无误地运行。这在MIT Scheme中而不是在Guile中生成错误的唯一原因是因为MIT Scheme对异常的应用更为丰富(也就是说,MIT Scheme的let语法特别关注确保您为其提供了语法规则)。它根本不是有效的R4RS代码,不应在任何R4RS兼容方案实现中工作。

MIT方案仅提供语法规则、语法闭包和用于定义语法转换器的显式重命名。对于后两种,您需要
sc macro transformer
er macro transformer
表单。如果要使用语法对象,则需要使用支持语法对象(通常随
syntax-case
)的实现,例如或


顺便说一下,即使在使用语法对象的语言中,宏定义也可能不起作用,因为您从转换器返回的是列表,而不是语法。此外,您链接到的网页是一个非常旧的标准。您可能需要阅读有关宏的最新资料,例如。

此处您想做什么?为什么没有语法规则关键字?您确定要使用let语法而不是let的常规版本吗?是的,这是有意的。我正在研究低层方案的宏观扩展机制。事实上我读了这一页:但是你误用了这个机制;那里没有变压器规格。您希望实现什么?lambda(x)…是转换器,它接受语法对象x,并返回语法对象'(#())。这是一个简化的语法使用的例子,从该网址,我张贴。