Я написал небольшой интерпретатор Scheme на C# и понял, что так, как я его реализовал, было очень легко добавить поддержку правильных продолжений.
Итак, я добавил их... но хочу «доказать», что то, как я их добавил, правильно.
Однако мой интерпретатор схемы не поддерживает «мутирующее» состояние — все неизменно.
Так что было довольно легко написать модульный тест, чтобы показать продолжение «вверх»:
AssertEqual(Eval("(call/cc (lambda (k) (+ 56 (k 3))))"), 3);
Однако я также хочу написать модульный тест, который демонстрирует, что если продолжение «убегает», то это тоже работает:
AssertEqual(Eval("(call/cc (lambda (k) k))", <some continuation>);
Но, конечно, приведенное выше просто проверит, что «у меня есть продолжение»… а не то, что это на самом деле действительное продолжение.
Однако все примеры, которые я могу найти, всегда заканчиваются использованием «set!». чтобы продемонстрировать сбежавшее продолжение.
Какой простейший пример Scheme демонстрирует правильную поддержку обратных продолжений, не полагаясь на мутацию?
Можно ли использовать обратное продолжение без мутации? Я начинаю подозревать, что это не так, потому что вы можете использовать его только для повторного выполнения точно такого же вычисления... что бессмысленно, если нет побочных эффектов. Поэтому в Haskell нет продолжений?