На странице «Продвинутая схема: некоторые непослушные биты» говорится:
Продолжения - это мощная конструкция потока управления, из которой может быть получена почти любая другая структура потока управления [...].
Я думал, что схемы call/cc
, связанные (*) с оператором J Питера Лэндена, могут быть использованы для реализации любой известной структуры потока управления?
Что касается «структуры потока управления», то я специально думаю об их описании в Википедии , например, об исключениях, сопрограммах, зеленых нитях и так далее.
В частности, есть ли примеры структур управления потоками, которые нельзя реализовать с помощью call/cc
?
(*) Мне не удалось выкопать какую-либо бумагу, в которой говорится, что call/cc
она так же мощна, как оператор J. Статья Феллайзена (которую я не читал и, по общему признанию, испытываю проблемы с ее полным пониманием) исследует это и, похоже, приходит к выводу, что, хотя они находятся в разных классах сложности, они формально эквивалентны.
(Также обратите внимание, что я обновил вопрос, основываясь на комментариях ниже)
Обновить
Основываясь на превосходном ответе @Neel ниже, я посмотрел сайты, комментирующие ограниченные и неограниченные продолжения , и действительно кажется, что call/cc
, будучи неограниченным, этого недостаточно. Между тем, кажется, что первоклассные продолжения с разделителями (вроде shift/reset
) могут использоваться для выражения любой структуры потока управления.
call/cc
не могут выражать исключения в отсутствие состояния . (Как продолжает Тилеке, исключения могут быть реализованы путем передачи двух продолжений, одного для программы и другого для обработчика исключений, но для этого требуется больше, чем просто call/cc
.)
amb
-оператор и так далее.