Может ли call-with-current-continue быть реализовано только с лямбдами и закрытием?
Кто-нибудь знает, может ли call/cc
быть реализован только с помощью лямбда и закрытия?
Кажется, что call/cc
прерывает поток программы (например, исключение), но lambdas и закрытия не могут этого сделать. Поэтому я думаю, что call/cc
не может быть реализовано через лямбды и замыкания.
Любые идеи?
Ответы
Ответ 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
, которое является активным при его вызове, отбрасывается).
Итак, чтобы ответить на ваш вопрос для Схемы: да, это можно сделать.