Когда это нужно
Сначала используйте обычные if, cond и процедуры. call/cc нужен лишь для одного явного выхода вверх из глубоко вложенного вычисления, а dynamic-wind — когда вход и очистка должны обрамлять такой выход.
Проверьте запуском
(call/cc (lambda (escape) (escape 'done) 'unreachable))Наблюдаемый результат
doneРазбор примера
call/cc передаёт процедуру выхода в lambda. Её вызов с done немедленно переносит значение во внешний call/cc; символ unreachable не вычисляется. Этим переносом продолжение расходуется.
Как рассуждать
- Первый вызов атомарно потребляет продолжение до передачи; каждый последующий вызов даёт E340.
dynamic-windвыполняетbefore, затем основную процедуру иafter; при раскрутке ожидающиеafterзапускаются изнутри наружу.- Новая ошибка или выход из процедуры
afterзаменяет уже передаваемый сигнал.
Быстрый выбор
| Задача | Предпочтение | Причина |
|---|---|---|
| обычный выбор | if или cond | локальный поток остаётся видимым |
| возврат из помощника | обычный результат процедуры | нет нелокального переноса |
| однократный выход через несколько вызовов | выход call/cc | один явный путь вверх |
| очистка вокруг возможного выхода | dynamic-wind | after выполняется при раскрутке |
| многократное возобновление одной точки | перестроить поток | продолжение одноразовое и нерекурсивное |
Частая ошибка
Многократное повторное использование продолжений и повторный вход в динамический контекст отложены.
Текущие границы
- Исключения и продолжения среды не реализуют гостевую передачу.
Куда дальше
Обычный поток управления описан в условиях, а взаимодействие ошибок с сигналами вычислителя — в диагностике.