sicp.io
3.1.1 · Присваивание и история

Локальное состояние процедуры

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

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

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

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

Процедура withdraw замыкает связывание balance. Каждый успешный вызов изменяет это связывание перед возвратом нового значения, поэтому следующий вызов начинается с другого значения balance.

Три вложенных выражения let с одним связыванием делают эту последовательность явной. Поэтому каждый результат отражает состояние, оставленное предыдущим вызовом, вместо того чтобы снова начинаться со 100.

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

    Первая программа возвращает (75 50 insufficient-funds). Неудачное снятие оставляет значение balance равным 50.

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

    Найдите каждое применение withdraw и выражение set! внутри двух успешных вызовов. Последний вызов переходит в другую ветвь и не выполняет присваивания.

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

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

    Вставьте снятие 10 между двумя вызовами снятия 25. Предскажите каждое возвращаемое значение перед запуском измененной последовательности.

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

    Запишите значение balance после каждого успешного вызова. Неудачный вызов его не меняет.

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

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