sicp.io
4.1.2 · Управление как часть смысла

Специальные формы и выбор вычисляемого

Вычислитель не может обрабатывать if как обычную процедуру, поскольку он должен выбрать одну ветвь до вычисления этой ветви.

Вопрос для размышления

Что пойдет не так, если вычислитель вычислит обе ветви if?

  • Распознавание синтаксиса с собственным правилом вычисления
  • Вычисление предиката перед выбором ветви
  • Наблюдение за тем, что невыбранное выражение не выполняет работы

Случай if сначала вычисляет только предикат. Затем он вызывает evaluate либо для следствия, либо для альтернативы, но никогда для обоих.

В первом примере альтернатива делит на ноль. Программа все равно возвращает 60, так как истинный предикат выбирает ветвь сложения, а некорректная альтернатива остается данными выражения.

Код SICP975 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Первая программа возвращает 60 без вычисления деления на ноль.

    На что обратить внимание в трассе

    После того как сравнение на меньше вернет true, проследите за вычислением в ветви сложения. В этом запуске не появляется применение деления.

    Попробуйте сами

    Измените программу и сравните результат.

    Измените score на 70 и замените альтернативу на score. Предскажите, какую ветвь посетит evaluate.

    Показать подсказку

    Базовый if внутри evaluate обеспечивает соблюдение правила вычисления для интерпретируемого if.

    Завершить этот урок

    В этой главе пройдено 0 из 23 урока0%