Модель подстановки и порядок вычислений
Модель подстановки заменяет параметры выражениями аргументов, а аппликативный и нормальный порядки дают один результат за разный объем работы.
Что подстановка показывает в применении процедур и что меняется, когда аргументы вычисляются до или после их подстановки в тело?
- Представление тела и применения процедуры в виде цитированных данных выражений
- Последовательная замена параметра по всему телу
- Разделение вычисления аргументов в аппликативном порядке и развертывания выражений в нормальном порядке
- Наблюдение повторных вычислений аргументов в явной модели нормального порядка
- Разграничение пояснительной модели подстановки и внутреннего устройства окружения во время выполнения
- Понимание того, что мутация и идентичность объектов требуют более богатой модели, чем простая подстановка
Первая программа не требует от 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, но количество их вызовов различается. Это сравнение фиксирует два явно написанных конечных плана и точное количество их вызовов.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Программа редукции возвращает ((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 встречается один раз.