sicp.io
1.1.2 · Именование и окружение

Имя и его окружение

Определения создают связывания для последующих выражений, а вызовы процедур и let добавляют локальные связывания поверх окружающего окружения.

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

Как вычислитель решает, какое значение обозначает имя, когда сосуществуют глобальные определения, параметры и локальные имена?

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

Определение связывает имя со значением в текущем окружении. rectangle-area не является текстовым сокращением для (* width height), это отдельное связывание, значение которого вычисляется при выполнении определения. Последующее создание списка ищет width, height, rectangle-area и perimeter по имени в том же окружении.

Вызов describe создает новое окружение, где параметр x связан со значением 3, даже если в окружающем окружении x уже связан со значением 10. Внутренний let добавляет y в это окружение вызова. Поиск связываний в теле сначала находит ближайшее совпадающее связывание, поэтому x обозначает 3 внутри вызова и 10 снаружи до и после него. Локальный y исчезает, когда вызов завершается.

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

    Программа с определениями возвращает (3 4 12 14). Программа с затенением имен возвращает ((global-x 10) (parameter-x 3 local-y 4 sum 7) (global-after 10)).

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

    В первом запуске отделите вычисление каждого определения от последующих поисков символов, которые извлекают сохраненные значения. Во втором запуске найдите окружение, созданное для describe, связывание параметра x = 3 и дополнительное связывание let для y = 4. Сравните эти операции поиска с глобальным связыванием x = 10 до и после вызова. Трасса выполнения фиксирует эту конечную историю окружения с учебными метками кадров.

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

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

    Добавьте глобальный y, равный 100, сохраните локальное связывание let с именем y и верните как внутренний результат describe, так и глобальный y после вызова. Спрогнозируйте, какое связывание использует каждое обращение к y.

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

    Локальный y находится ближе во время выполнения тела процедуры. После завершения вызова видимым остается только глобальный y.

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

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