Реализация Racket для R 6 RS в данном случае не является несовместимой.В самом деле, во всяком случае, он более точно следует стандарту: ваша программа, как она написана, не заботится о фазах импорта.Проблема в том, что define-syntax
оценивает его правую часть во время раскрытия, как отмечено в разделе 11.2.2 Определения синтаксиса :
Связывает со значением, который должен вычислять во время макроразвития для трансформатора.
В отличие от других стандартов Схемы, R 6 RS обеспечивает различие между фазами, посколькуон допускает произвольное программирование во время компиляции (в то время как другие стандарты Scheme этого не делают).Поэтому в разделе 7.1 Форма библиотеки указано, как импортировать библиотеки на определенных этапах:
Каждаяопределяет набор привязок, которые будут импортированы в библиотеку, уровни, на которых они должны быть доступны, и локальные имена, под которыми они должны быть известны.должен быть одним из следующих:
<import set>
(for <import set> <import level> ...)
Anявляется одним из следующих:
run
expand
(meta <level>)
, где представляет точный целочисленный объект.
Следовательно, вам необходимо импортировать (rnrs base)
как для run
, так и дляexpand
фаз, и вам нужно импортировать (rnrs syntax-case)
на стадии расширения.Вы можете сделать это с помощью следующей программы:
#!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)
Эта программа работает в Racket.Я не проверял, работает ли он также на других реализациях Схемы, которые вы перечислили, но он должен работать, если они соответствуют стандартам.