这是我的小程序:
(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)
答案 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)