Scheme Racket R6RS支持:语法大小写
这个简单的R6RS程序:Scheme Racket R6RS支持:语法大小写,scheme,racket,r6rs,Scheme,Racket,R6rs,这个简单的R6RS程序: #!r6rs (import (rnrs base) (rnrs syntax-case) (rnrs io simple)) (define-syntax stest (lambda (x) (syntax-case x () ((_ z) #'(z 0))))) (stest display) 与Chez、Guile和Ypsilon合作,但不与Racket合作。它给了我这个: test.scm:7:3:l
#!r6rs
(import (rnrs base)
(rnrs syntax-case)
(rnrs io simple))
(define-syntax stest
(lambda (x)
(syntax-case x ()
((_ z) #'(z 0)))))
(stest display)
与Chez、Guile和Ypsilon合作,但不与Racket合作。它给了我这个:
test.scm:7:3:lambda:转换器中的未绑定标识符
环境此外,没有绑定#%app语法转换器
我的问题是,R6RS是坏了还是我必须做些别的事情?我正在使用版本6.12进行测试。在这种情况下,R6RS的Racket实现不符合要求。事实上,如果有什么不同的话,它更严格地遵守了标准:您编写的程序在导入阶段并不谨慎。问题在于,
define syntax
在展开期间计算其右侧,如第节所述:
绑定到的值,该值必须在宏展开时计算到转换器
与其他Scheme标准不同,R6RS注意区分阶段,因为它允许在编译时进行任意编程(而其他Scheme标准则不允许)。因此,第节指定了如何在特定阶段导入库:
每个都指定要导入到库中的一组绑定、可用绑定的级别以及已知绑定的本地名称。必须是以下内容之一:
<import set>
(for <import set> <import level> ...)
run
expand
(meta <level>)
这个程序在Racket中工作。我没有测试它是否也适用于您列出的其他Scheme实现,但应该测试它们是否符合标准。也适用于其他实现。太棒了,谢谢!
#!r6rs
(import (for (rnrs base) run expand)
(for (rnrs syntax-case) expand)
(rnrs io simple))
(define-syntax stest
(lambda (x)
(syntax-case x ()
((_ z) #'(z 0)))))
(stest display)