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