Песочница

Одноразовые продолжения и dynamic-wind

Текущий call/cc создаёт одноразовое продолжение только для выхода вверх. Повторный вход запрещён, а передача управления выражена явными сигналами интерпретатора, который выполняет вашу программу.

Когда это нужно

Сначала используйте обычные if, cond и процедуры. call/cc нужен лишь для одного явного выхода вверх из глубоко вложенного вычисления, а dynamic-wind пригодится, когда вход и очистка должны обрамлять такой выход.

Проверьте запуском

LISPEX
(call/cc (lambda (escape) (escape 'done) 'unreachable))

Наблюдаемый результат

OUTPUT
done

Разбор примера

call/cc передаёт процедуру выхода в lambda. Её вызов с done немедленно переносит значение во внешний call/cc, а символ unreachable не вычисляется. Этим переносом продолжение расходуется.

dynamic-wind принимает три процедуры. Одну на вход, одну на работу в середине и одну на выход.

LISPEX
(dynamic-wind
  (lambda () (display "before "))
  (lambda () (display "during "))
  (lambda () (display "after")))

Наблюдаемый результат

OUTPUT
before during after

Последняя процедура выполняется и тогда, когда выход из середины уносит вас наружу. Именно там место уборке.

Как рассуждать

  • Первый вызов атомарно потребляет продолжение до передачи, а каждый последующий вызов даёт E340.
  • dynamic-wind выполняет before, затем основную процедуру и after. При раскрутке ожидающие after запускаются изнутри наружу.
  • Новая ошибка или выход из процедуры after заменяет уже передаваемый сигнал.

Быстрый выбор

ЗадачаПредпочтениеПричина
обычный выборif или condлокальный поток остаётся видимым
возврат из помощникаобычный результат процедурынет нелокального переноса
однократный выход через несколько вызововвыход call/ccодин явный путь вверх
очистка вокруг возможного выходаdynamic-windafter выполняется при раскрутке
многократное возобновление одной точкиперестроить потокпродолжение одноразовое и нерекурсивное

Частая ошибка

Многократное повторное использование продолжений и повторный вход в динамический контекст отложены.

Текущие границы

  • Исключения и продолжения среды не реализуют гостевую передачу.

Куда дальше

Обычный поток управления описан в условиях, а диагностика показывает, как ошибки идут по тем же явным сигналам интерпретатора.

Условия · Диагностика