sicp.io
1.1.4 · Модель подстановки

Модель подстановки и порядок вычислений

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

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

Что подстановка показывает в применении процедур и что меняется, когда аргументы вычисляются до или после их подстановки в тело?

  • Представление тела и применения процедуры в виде цитированных данных выражений
  • Последовательная замена параметра по всему телу
  • Разделение вычисления аргументов в аппликативном порядке и развертывания выражений в нормальном порядке
  • Наблюдение повторных вычислений аргументов в явной модели нормального порядка
  • Разграничение пояснительной модели подстановки и внутреннего устройства окружения во время выполнения
  • Понимание того, что мутация и идентичность объектов требуют более богатой модели, чем простая подстановка

Первая программа не требует от Lispex переключения стратегий вычисления. Она рассматривает вызов (square (+ 2 3)) и тело (* x x) как цитированные данные, а затем строит два классических пути редукции. Аппликативный путь сначала вычисляет (+ 2 3), подставляет значение 5 и редуцирует (* 5 5). Нормальный путь сначала подставляет невычисленное выражение операнда, получая (* (+ 2 3) (+ 2 3)), и только затем редуцирует обе копии.

Вторая программа делает разницу в объеме работы наглядной с помощью процедуры argument, которая увеличивает счетчик. Обычный вызов Lispex вида (square (argument)) вычисляет аргумент один раз перед применением square. Явный план normal-model вызывает argument дважды, потому что тело использует x дважды. Оба плана возвращают 25, но количество их вызовов различается. Это сравнение фиксирует два явно написанных конечных плана и точное количество их вызовов.

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

    Программа редукции возвращает ((applicative (square (+ 2 3)) (square 5) (* 5 5) 25) (normal (square (+ 2 3)) (* (+ 2 3) (+ 2 3)) (* 5 5) 25)). Программа с планами выполнения возвращает ((applicative 25 1) (normal-model 25 2)).

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

    В первом запуске проследите за substitute для обоих вхождений x и сравните замену значением 5 с заменой выражением (+ 2 3). Во втором запуске найдите одно применение argument внутри обычного вызова процедуры и два применения argument в явно записанном умножении normal-model. Трасса выполнения фиксирует только фактически выполненный код, а цитированные списки редукции служат пояснительными данными, а не скрытыми кадрами вычислителя.

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

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

    Используйте тело (+ (* x x) y), подставьте (+ 1 2) вместо x и 4 вместо y, затем постройте аппликативный путь и путь нормального порядка в виде данных. Спрогнозируйте, сколько копий (+ 1 2) появится до редукции.

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

    Подставляйте параметры по одному. Поскольку x встречается дважды, тело при нормальном порядке содержит две копии своего выражения операнда, а y встречается один раз.

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

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