Разница между разделенными и неограниченными продолжениями - PullRequest
7 голосов
/ 19 мая 2011

Полагаю, что разница между delimited и undelimited продолжениями подобна разнице между call и jump.

Если мы вызовем продолжение delimited, оно вернется к вызывающей стороне после завершения. Если мы вызываем undelimited продолжение, оно работает как goto и никогда не возвращается к вызывающей стороне.

Имеет ли это смысл? Я что-то пропустил?

Ответы [ 2 ]

7 голосов
/ 20 мая 2011

Вы немного не в курсе. Продолжения любого типа не имеют ничего общего с goto (прыжки). Однако у них есть все, что связано со стеком.


Классические продолжения

Помните, что регулярные продолжения фиксируют понятие стека управления как значения первого класса. Стеки могут быть названы, переданы в качестве аргументов, и к ним могут быть применены значения, приводящие к изменению потока управления, с помощью простого API, основанного на приложении функции через callCC.

Продолжение с разделителями

Что продолжения с разделителями добавляют к смеси?

Напомним, что регулярные продолжения захватывают весь стек вызовов до определенной точки. Что если бы мы могли поместить в них маркеры, точно говоря, какую часть стека управления нужно сохранить в продолжении? Этакий «разделитель» стека управления.

Это идея, и теперь у вас есть супер-классные продолжения с разделителями: разделять, захватывать и манипулировать произвольными частями программы как значением. Идеально подходит для возобновления и пошаговой обработки, а также для других сложных форм управления потоком.

Ссылки

Примечания

Некоторые исправления от Олег Киселев , полученные вне списка:

2 голосов
/ 21 мая 2011

Продолжения как языковая особенность (в отличие от продолжений в виде шаблона программирования) - это реализации (части) контекста управления («стека»). Как сказал Дон, неограниченные продолжения представляют весь контекст, тогда как ограниченные продолжения представляют только его часть.

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

Как правило, захват продолжения с разделителями (например, с помощью shift) немедленно прерывает сегмент контекста управления до ближайшего разделителя (например, reset) и превращает его в то, что кажется простой старой функцией ( хотя это может быть реализовано как хитрость стека, а не как обычные функции).

Кстати, продолжения иногда называют «первоклассными прыжками», но это не значит, что они имеют больше общего с инструкцией jmp, чем обычный вызов функции.

...