Может ли call-with-current-продолжение быть реализовано только с лямбдами и замыканиями? - PullRequest
14 голосов
/ 28 сентября 2010

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

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

Есть еще идеи?

Ответы [ 2 ]

12 голосов
/ 28 сентября 2010

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

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

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

11 голосов
/ 04 октября 2010

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

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

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

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

...