sicp.io
3.2.2 · Применение простых процедур

Кадр применения и его родитель

Фиксируйте кадры параметров и родительские связи, пока составная процедура вызывает другую процедуру или возвращает замыкание для последующего применения.

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

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

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

Процедура modeled-sum-of-squares записывает один кадр, содержащий x = 3 и y = 4. Затем каждый вызов modeled-square записывает отдельный дочерний кадр, собственное связывание x которого равно 3 или 4. Повторяющееся имя параметра не перезаписывает другой вызов, поскольку каждое применение владеет собственным отдельным кадром.

Процедура make-adder записывает кадр, где x = 5, и возвращает замыкание, сохраняющее доступ к нему. Последующий вызов add-five создает кадр y = 7, связанный с этим захваченным окружением. В протоколе используются учебные имена кадров, чтобы сделать эти связи явными.

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

    Первая программа возвращает (25 ((sum-of-squares global ((x . 3) (y . 4))) (square sum-of-squares ((x . 3))) (square sum-of-squares ((x . 4))))). Вторая программа возвращает (12 ((make-adder global ((x . 5))) (returned-procedure make-adder ((y . 7))))).

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

    Сравните смоделированные записи кадров с фактическими применениями процедур. Найдите два отдельных вызова square и родительское применение, запросившее их. При выполнении замыкания отделите возврат make-adder от последующего применения add-five и найдите место обращения к захваченному x.

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

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

    Добавьте modeled-average и вызовите ее дважды из одной смоделированной процедуры. Присвойте каждому кадру вызова отдельный числовой идентификатор и зафиксируйте как его лексического родителя, так и запросившего его вызывающего.

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

    Лексический родитель и динамический вызывающий отвечают на разные вопросы. Сохраняйте оба поля явными в объяснительной записи.

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

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