В Схеме, что является возвращаемым значением `(begin)`?

Я знаю это (begin expr1 expr2 ...) оценит все выражения и вернет последнее оцененное.

Я обнаружил, что в Chez Scheme разрешено использовать begin без выражений вроде так: (begin), Я использую схему Chez как часть моих исследований. Когда я пишу в консоли (begin) он не отправляет синтаксическую ошибку, он просто ничего не отображает, как будто я получаю void,

У меня вопрос, что тогда будет возвращено?

Я думал, что это был пустой объект, который вы можете получить, запустив (void), Однако, когда я проверил это, я понял, что это не так.

Я изучаю Chez Scheme как часть курса компилятора, который я беру, и мне нужно реализовать часть компилятора, которая может обрабатывать специальное слово begin, Поэтому мне нужно знать, почему это вообще возможно, и что возвращает эта функция.

РЕДАКТИРОВАТЬ:

Я добавляю эту ссылку относительно этой темы. Я не смог полностью понять ответ. Кроме того, он не упомянул тип возврата.

1 ответ

Решение

Я думаю, что вопрос сбивает с толку различные варианты использования begin, Если вы посмотрите на R6RS раздел 11.4.7 о begin, он используется двумя различными способами: 1) с 0 или более "формами", и в этом случае формы синтаксически "вклеиваются" в окружающее тело, как если бы begin там не было (я считаю, что это в основном полезно при написании макросов); и 2) с 1 или более выражениями, в этом случае он оценивает выражения в последовательности и возвращает результат последнего.

Когда вы говорите о "возвращаемом значении", вы говорите о (begin ...) как выражение, но как выражение (вторая форма begin выше), оно должно принимать одно или несколько выражений. Пустой (begin) должна быть первой формой begin, который просто склеивает "ничто" (0 форм) в окружающее тело, но это не "оценивается" отдельно от оценки тела в целом.