Я думаю, что понимаю (в общем), что означают shift
и reset
. Однако я не понимаю, почему их так называют? Что делать shift
и reset
как примитивы с разделителями продолжения, связанные с словами "shift" и "reset" на английском языке?
Почему разделительные примитивы продолжения называются "shift" и "reset"?
Ответ 1
Они называются так из-за того, как они реализованы (в общем).
Цитата из Прямая реализация Shift и Reset в компиляторе MinCaml
Интерпретируя программу, используя семантику продолжения, мы можем рассматривать состояние программы как продолжение стек. Тогда
reset
может быть как обозначение продолжения стек иshift
, захватив стек продолжения до ближайшего метка, созданнаяreset
. Здесь обзор реализации:
- При вызове
reset
установите reset знак в стек- При вызове
shift
(fun k -> M)
, переместите часть фреймов стека до ближайший знак Reset в кучу- При вызове продолжения
k
установите метку reset в стек и скопируйте соответствующие кадры из кучи в верхняя часть стека.Значок Reset вставлен, когда
k
так как захваченные продолжения выполняются в пустом продолжении.
Ответ 2
Потому что так, как Данви и Филински назвали эти два оператора в первой статье, где они выставили эту модель стиля продолжения прохождения (см. также здесь), и это то, что реализует Scala.
Реализация в Scala описана в этой другой статье. Ссылка на Данви и Филински ясно:
В этой статье мы изучаем добавление сдвига операторов управления и reset к этой языковой структуре, которые вместе реализуют статические разделительные продолжения (Danvy and Filinski 1990, 1992)