Специальные формы и выбор вычисляемого
Вычислитель не может обрабатывать if как обычную процедуру, поскольку он должен выбрать одну ветвь до вычисления этой ветви.
Что пойдет не так, если вычислитель вычислит обе ветви if?
- Распознавание синтаксиса с собственным правилом вычисления
- Вычисление предиката перед выбором ветви
- Наблюдение за тем, что невыбранное выражение не выполняет работы
Случай if сначала вычисляет только предикат. Затем он вызывает evaluate либо для следствия, либо для альтернативы, но никогда для обоих.
В первом примере альтернатива делит на ноль. Программа все равно возвращает 60, так как истинный предикат выбирает ветвь сложения, а некорректная альтернатива остается данными выражения.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает 60 без вычисления деления на ноль.
После того как сравнение на меньше вернет true, проследите за вычислением в ветви сложения. В этом запуске не появляется применение деления.
Измените программу и сравните результат.
Измените score на 70 и замените альтернативу на score. Предскажите, какую ветвь посетит evaluate.
Показать подсказку
Базовый if внутри evaluate обеспечивает соблюдение правила вычисления для интерпретируемого if.