Поддержка Racket R6RS: синтаксис-кейс - PullRequest
0 голосов
/ 12 июня 2018

Эта простая программа 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: несвязанный идентификатор в среде преобразователя;
также, нет #% синтаксического преобразователя приложения привязан

У меня вопрос, он сломан для R6RS или я должен сделать что-то еще?Я тестирую с версией 6.12.

1 Ответ

0 голосов
/ 12 июня 2018

Реализация 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.Я не проверял, работает ли он также на других реализациях Схемы, которые вы перечислили, но он должен работать, если они соответствуют стандартам.

...