Почему (начало) действительно в Схеме?

Я проверил в Racket и Chez Scheme и нашел (begin) приемлемо в то время как (define a (begin)) не является. Например с Ракеткой я получил

> (begin)
> (define a (begin))
; stdin:56:10: begin: empty form not allowed

И мой вопрос почему (begin) разрешено вообще? Есть ли какая-то конкретная причина / интуиция для этого?

2 ответа

Решение

Форма начала имеет две цели.

1. To sequence the evaluation of expressions 
2. To "splice" sequences together (used by macros)

Первый - это то, что используется чаще всего:

(begin e0 e1 ...)

оценим выражения e0 e1... по порядку.

Второй используется, когда макрос расширяется до нескольких определений и / или выражений.

Как пример, следующее

(begin
   (begin d1 e1 d2 d3)
   (begin)
   e2
   ...)

будет сглаживаться макроэкспандером в:

(begin d1 e1 d2 d3 e2 ...)

Теперь к вопросу "Почему (начинать) вообще разрешено?". Если begin был использован для цели 1 (последовательность), а затем пустой begin может быть запрещено Для цели 2 (сплайсинга) очень удобно использовать (begin) в результате макроса, который ничего не делает. Рассмотрим макрос (debug expression) что либо расширяется в expression (когда включена отладка) или в (begin) когда отладка отключена.

Ответ, который я разместил здесь о (begin ()) еще одна приемлемая причина для использования начала в (if () ) заявления.

Другие вопросы по тегам