LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Передаем только в случае cps (ну как в sbcl) а при нативной реализации ничего никуда не передается.

(define (test f)
   (let ((i 0))
     (f)
     (set! i (+ i 1))
     i))

По твоему утверждению в функцию f ничего не передаётся. Теперь делаем так:

(define the-continuation #f)
(define (fun) (call/cc (lambda (k) (set! the-continuation k))))
(test fun)
(the-continuation) -> 2
(the-continuation) -> 3

Обрати внимание, в функции call/cc внутри fun внезапно оказался доступ к переменной i из test и к куску кода после вызова f. Откуда?

Исходная версия monk, :

Передаем только в случае cps (ну как в sbcl) а при нативной реализации ничего никуда не передается.

(define (test f)
   (let ((i 0))
     (f)
     (set! i (+ i 1))
     i))

По твоему утверждению в функцию f ничего не передаётся. Теперь делаем так:

(define the-continuation #f)
(define (fun) (call/cc (lambda (k) (set! the-continuation k))))
(test fun)
(the-continuation) -> 2
(the-continuation) -> 3


Обрати внимание, в функции call/cc внутри fun внезапно оказался доступ к переменной i из test и к куску кода после вызова f. Откуда?