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