вызов с продолжением тока - концепция сохранения состояния
После прочтенияОпытный интриган Я чувствовал, что понял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
на самом деле работа?