Подтвердить что ты не робот

Может ли call-with-current-continue быть реализовано только с лямбдами и закрытием?

Кто-нибудь знает, может ли call/cc быть реализован только с помощью лямбда и закрытия?

Кажется, что call/cc прерывает поток программы (например, исключение), но lambdas и закрытия не могут этого сделать. Поэтому я думаю, что call/cc не может быть реализовано через лямбды и замыкания.

Любые идеи?

4b9b3361

Ответ 1

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

В любом случае продолжения могут быть использованы на любом языке с закрытием путем ручного ввода в стиль продолжения прохождения. Тогда автоматический перевод в эту форму может быть реализован путем расширения компилятора, который Lisp обычно позволяет на уровне пользователя через макросы. Например, см. cl-cont, библиотеку, реализующую продолжения для Common Lisp, который является языком, на котором они не встроены.

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

Ответ 2

В схеме вы можете реализовать call/cc с помощью lambdas при преобразовании в стиль продолжения прохождения (CPS). При преобразовании в CPS каждое вхождение call/cc можно заменить следующим эквивалентом:

(lambda (f k) (f (lambda (v k0) (k v)) k))

где k - это продолжение для сохранения, а (lambda (v k0) (k v)) - это процедура эвакуации, которая восстанавливает это продолжение (любое продолжение k0, которое является активным при его вызове, отбрасывается).

Итак, чтобы ответить на ваш вопрос для Схемы: да, это можно сделать.