Тело библиотеки R6RS: определение после выражения

Рассмотрим следующий код:

#!r6rs
(library
 (test)
 (export)
 (import (rnrs))

 (define a 5)
 (begin
   (define b 4)
   (+ 3 b))
 'cont
 (define c 5)
 'done)

Из отчета R6RS 7.1:

<Тело библиотеки> похоже на <тело> (см. Раздел 11.3), за исключением того, что <тело библиотеки>не должно включать никаких выражений. Он должен иметь следующую форму:

<definition> ... <expression> ...

Я думал, что это приведет к ошибке, потому что определение c после выражения 'cont, но эта программа принята чисто.

После чего я подумал a а также c может быть экспортировано. Но нет c но b можно экспортировать. (a можно экспортировать как я и думал.)

Я думаю, что есть кое-что, чего я не осознавал в правилах библиотеки R6RS. Какой смысл я упускаю? Заранее спасибо.

ps) я использую Racket v5.3.3

2 ответа

Решение

Из спецификации R6RS 2007:

A library definition must have the following form:

(library <library name>
  (export <export spec> ...)

  (import <import spec> ...)

  <library body>)


...

 The <library body> is the library body, consisting of a sequence of definitions 
 followed by a sequence of expressions. The definitions may be both for local 
 (unexported) and exported bindings, and the expressions are initialization 
 expressions to be evaluated for their effects.

Таким образом, для вашего примера кода должна была возникнуть ошибка.

Извините, это не правильный ответ. Так работает программа на верхнем уровне, а не библиотека на верхнем уровне. Оставив его здесь для справки.

В программе уровень вещей немного отличается от обычного (нормальный способ, которым вы его интерпретировали).

Код будет переписан компилятором так, чтобы он выглядел примерно так:

(define a 5)
(define b 4)
(define dummy1 (+ 3 b))
(define dummy2 'cont)
(define c 5)
'done

Заметки:

  • begin сращивания на верхнем уровне
  • Для любого не определения выражение назначается фиктивной переменной
  • В конечном итоге верхний уровень выглядит как letrec* и применяются те же правила
Другие вопросы по тегам