Что в схеме возвращает значение `(begin)`?

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

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

Мой вопрос: что тогда будет возвращено?

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

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

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

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


comment
Если вы реализуете часть компилятора, ваше определение значения языковых форм должно исходить из спецификации, а не из существующего поведения. Правильно?   -  person John Clements    schedule 24.11.2017


Ответы (1)


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

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

person newacct    schedule 26.11.2017
comment
Спасибо за ваш ответ. Если я правильно вас понял, вы говорите, что использование (begin) без выражений не является процедурой, а скорее макроподобным инструментом, и поэтому не возвращает никакого значения, и я могу просто использовать его, когда это разрешено? - person PeNpeL; 28.11.2017
comment
@PeNpeL: Ну, begin сама по себе не процедура; это особая форма языка. Но в основном да, (begin) не является использованием формы выражения begin, и это не выражение само по себе. Если вашему компилятору не требуется поддержка сложных макросов, возможно, вы можете пока игнорировать форму сращивания форм begin. - person newacct; 28.11.2017