Этот вопрос задавался несколько раз на SO, но ни один из них не решает мой вопрос. Что такое продолжение?
Рассмотрим следующий код:
( (lambda (pair)
(begin (print (car pair))
((cdr pair) (cons (+ 1 (car pair))
(cdr pair)))))
(call/cc (lambda (k)
(cons 0 k))))
Эта программа бесконечно зацикливается, печатая последовательность целых чисел, начиная с 0.
Я понимаю:
Шаг 1: оценивается (call/cc (lambda (k) (cons 0 k)))
, возвращается пара (0 . #continuation)
(что здесь #continuation
)
Шаг 2: Примените пару из шага 1 к лямбда-функции. Лямбда-функция сначала выводит car
, что равно 0.
Теперь я совсем потерялся. Программа оценивает (#continuation (1 . #continuation))
, что мне не очень понятно. Является ли #continuation
процедурой?
Что заставляет программу продолжать применять (call/cc (lambda (k) (cons 0 k)))
к лямбда-функции? Чтобы он мог продолжать называть себя