вызов с продолжением тока - концепция сохранения состояния

После прочтенияОпытный интриган Я чувствовал, что понялcall/cc должным образом. Но, увидев некоторые трюки WOW сcall/cc Я обнаружил, что был неправ.

(define cc 0)
(define (f)
  (call/cc (lambda (k)
             (set! cc k)
             3)))

(+ 1 2 4 (f)) ; eval's to 10
(cc 13) ; eval's to 20

Это идеально соответствует моему пониманию. Я думаю, когда я достигнуcall/cc звоните я просто сохраняю состояние программы. и вызывая функцию рядом с ней с функцией. Если эта функция (k) называется откуда-то, чем я просто заменяю весь(call/cc ...) материал с заданным ему параметром.Вышеупомянутая программа, кажется, работала так же

Но,

(define (itr lst)
  (define (state k)
    (for-each (lambda (item)
                (call/cc (lambda (h)
                           (set! state h)
                           (k item))))
              lst)
    (k 'done))

  (define (generator)
    (call/cc (lambda (k) (state k))))
  generator)

(define (next)
  (itr (range 2)))

призваниеnext 3 раза выдает 0, 1 и'done, Это значит, когдаstate использовал функциюk даноgenerator это не восстановило состояние программы.Я только что показал тебе, что пытался это понять.

Итак, как жеcall/cc на самом деле работа?

Ответы на вопрос(2)

Ваш ответ на вопрос