Scheme Racket 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程序:

#!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)