Я смотрю на следующий пример сопрограммы из http://community.schemewiki.org/?call-with-current-continuation:
(define (hefty-computation do-other-stuff)
(let loop ((n 5))
(display "Hefty computation: ")
(display n)
(newline)
(set! do-other-stuff (call/cc do-other-stuff)) ; point A
(display "Hefty computation (b)")
(newline)
(set! do-other-stuff (call/cc do-other-stuff))
(display "Hefty computation (c)")
(newline)
(set! do-other-stuff (call/cc do-other-stuff))
(if (> n 0)
(loop (- n 1)))))
лишняя работа:
;; notionally displays a clock
(define (superfluous-computation do-other-stuff)
(let loop ()
(for-each (lambda (graphic)
(display graphic)
(newline)
(set! do-other-stuff (call/cc do-other-stuff)))
'("Straight up." "Quarter after." "Half past." "Quarter til.")) ; point B
(loop)))
(hefty-computation superfluous-computation)
Какой должен быть контекст при первом использовании call / cc? Когда я говорю о контексте, я имею в виду, куда мы должны «вернуться» в результате перехода callcc?
Насколько я понимаю, в первый раз, когда вы вызываете call / cc, do-other-stuff по сути становится процедурой, которая выполняет код избыточных вычислений, а затем переходит к точке сразу после набора! (точка А). Во второй раз он обернет свое поведение «переход к точке B» вокруг «перехода к точке A и выполнения контекста или любого другого кода, следующего за точкой A». Это верно?
Не похоже, что этот код будет работать, если установить! на самом деле произошло. Или это набор! необходимо для работы этого кода?
Визуальное представление того, что происходит, действительно поможет.