Почему (начало) действительно в Схеме?
Я проверил в 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 () )
заявления.