Является ли call/cc копией фрейма стека или фактическим скачком выполнения?

Я не понимаю, как следующее не создает бесконечный цикл:

(define call/cc call-with-current-continuation) ; ccc alias
(define return #f) ; declare a global variable 'return'

(+ 1 (call/cc (lambda (cont) ; setup continuation with 'cont' as the exit procedure
                (set! return cont) ; set global var 'return' to the exit procedure
                1))) 

(return 22) ; 23

Когда я вызываю (return 22), я возвращаюсь к продолжению, но с переданным значением 22 в качестве нового оцененного результата формы call/cc. Не приведет ли это к тому, что (return 22) будет оцениваться как следующий оператор, создавая тем самым бесконечный цикл?

Я знаю, что это не бесконечный цикл, но я не понимаю, почему это не так.


person SquareCrow    schedule 10.12.2014    source источник
comment
посмотрите, помогает ли это.   -  person Will Ness    schedule 12.12.2014


Ответы (1)


Это это бесконечный цикл. Однако в большинстве реализаций Scheme формы верхнего уровня оцениваются в подсказки.

Если вы поместите свои выражения, скажем, в (let () ...), вы обязательно увидите эффект бесконечного цикла.

person Chris Jester-Young    schedule 10.12.2014