В моей жизни я не могу понять продолжения. Я думаю, проблема связана с тем, что я не понимаю, для чего они нужны. Все примеры, которые я нашел в книгах или в Интернете, очень тривиальны. Они заставляют меня удивляться, почему кто-то даже хочет продолжения?
Здесь типичный непрактичный пример, из TSPL, который, я считаю, является довольно узнаваемой книгой по этому вопросу. На английском языке они описывают продолжение как "что делать" с результатом вычисления. Хорошо, это понятно.
Тогда второй пример:
(call/cc
(lambda (k)
(* 5 (k 4)))) => 4
Как это имеет смысл? k
даже не определено! Как этот код может быть оценен, когда (k 4)
невозможно даже вычислить? Не говоря уже о том, как известно call/cc
, чтобы вырезать аргумент 4
во внутреннее большинство выражений и вернуть его? Что происходит с (* 5 ..
? Если это внешнее выражение отбрасывается, зачем даже писать его?
Тогда, "менее" тривиальный пример изложен как использовать call/cc
для обеспечения нелокального выхода из рекурсии. Это похоже на директиву управления потоком, т.е. Как break/return
на императивном языке, а не на вычисление.
И какова цель прохождения этих движений? Если кому-то нужен результат вычисления, почему бы просто не сохранить его и не вспомнить позже, если это необходимо.