Локальное состояние процедуры
Локальное связывание становится состоянием, когда последующие вызовы могут наблюдать значение, оставленное предыдущими вызовами.
Что меняется, когда ответ зависит от предшествующих ему вызовов?
- Различение возвращаемого значения и сохраненного состояния
- Отслеживание присваивания между последовательными вызовами
- Распознавание момента, когда порядок вызовов становится наблюдаемым
Процедура withdraw замыкает связывание balance. Каждый успешный вызов изменяет это связывание перед возвратом нового значения, поэтому следующий вызов начинается с другого значения balance.
Три вложенных выражения let с одним связыванием делают эту последовательность явной. Поэтому каждый результат отражает состояние, оставленное предыдущим вызовом, вместо того чтобы снова начинаться со 100.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (75 50 insufficient-funds). Неудачное снятие оставляет значение balance равным 50.
Найдите каждое применение withdraw и выражение set! внутри двух успешных вызовов. Последний вызов переходит в другую ветвь и не выполняет присваивания.
Измените программу и сравните результат.
Вставьте снятие 10 между двумя вызовами снятия 25. Предскажите каждое возвращаемое значение перед запуском измененной последовательности.
Показать подсказку
Запишите значение balance после каждого успешного вызова. Неудачный вызов его не меняет.