这是我的小程序:
(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)
最佳答案
MIT Scheme 仅提供syntax-rules
、语法闭包和用于定义语法转换器的显式重命名。对于后两者,您需要 sc-macro-transformer
或 er-macro-transformer
形式。如果你想使用语法对象,你需要使用支持语法对象的实现(通常带有 syntax-case
),例如 Racket或 Guile .
顺便说一句,即使在具有语法对象的语言中,您的宏定义也可能无法工作,因为您从转换器而不是语法返回列表。此外,您链接到的网页是一个相当古老的标准。您可能想阅读有关宏的最新资源,例如 TSPL4 .
关于lisp - 语法绑定(bind)值必须是关键字 : alpha. 什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13110941/