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