sicp.io
1.3.5 · Процедуры как возвращаемые значения

Процедура как результат другой процедуры

Композиция, повторение и усреднение с торможением делают поведение данными. Процедура принимает другие процедуры и возвращает новое преобразование.

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

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

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

compose принимает два значения процедуры и возвращает новую процедуру. Вызов compose еще не возводит число в квадрат и не увеличивает его на единицу, он строит преобразование, которое сохраняет f и g. Только последующее применение передает x, вычисляет g от x и затем применяет f к этому результату. repeated использует ту же идею рекурсивно, возвращая тождественное преобразование при нуле и еще одну композицию при каждом большем числе повторений.

average-damp также возвращает процедуру. Возвращенное преобразование вычисляет исходную f для x и находит среднее значение этого результата и x. Для преобразования квадратного корня y ↦ 16/y приближение 2 становится 5, тогда как неподвижная точка 4 остается 4. Конструктор процедур содержит повторно используемый метод, а переданная f определяет преобразуемое поведение.

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

    Программа с композицией возвращает (49 37 15). Программа с усреднением с торможением возвращает (5 4 21).

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

    Отделите вызовы, которые создают возвращаемые процедуры, от последующих вызовов, которые их применяют. В примере с композицией сравните применение square после increment с применением increment после square. В примере с торможением найдите вызов захваченной f до вычисления среднего. Трасса выполнения фиксирует порядок вызовов и результат каждого конечного применения.

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

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

    Определите twice только через compose, затем верните как ((twice increment) 10), так и ((twice square) 3). Предположите оба значения до запуска программы.

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

    twice должна возвращать процедуру, эквивалентную композиции f с самой собой, ожидаемые значения равны 12 и 81.

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

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