Call-with-Current-Continuation - Zustandssparendes Konzept
Nach dem LesenDer erfahrene Schemer Ich fühlte mich verstandencall/cc
richtig. Aber nach ein paar WOW-Tricks mitcall/cc
Ich fand, ich habe mich geirrt.
(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
Das passt perfekt zu meinem Verständnis. Ich denke, wenn ich a erreichecall/cc
aufruf ich speichere gerade den programmstatus. und Aufrufen der Funktion daneben mit einer Funktion. Wenn diese Funktion (k
) heißt von irgendwoher, als ich nur das ganze ersetze(call/cc ...)
Zeug mit dem Parameter, der ihm gegeben wurde.Das obige Programm scheint auch so zu funktionieren
Aber,
(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)))
Berufungnext
3 mal ergibt 0, 1 und'done
. Das heißt wannstate
hat die Funktion benutztk
gegeben durchgenerator
Der Status des Programms wurde nicht wiederhergestellt.Ich habe dir nur gezeigt, dass ich versucht habe, es zu verstehen.
Also, wie geht das?call/cc
eigentlich arbeiten?