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

StackOverflow https://stackoverflow.com/questions/3811448

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top