Я думаю, что понимаю (в общем), что означают 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)