Sto cercando di apprendere le continuazioni e usarle per implementare le coroutine in Scheme.
Ho due procedure (coroutine) a
e b
, e io cambio tra loro nel modo seguente:
;; c is a continuation.
(define (a c)
...
;; Switch to the other coroutine.
(call/cc c)
...
(define (b c)
...
;; Switch to the other coroutine.
(call/cc c)
...
Inizio l'esecuzione con
(a b)
Ho testato un piccolo esempio e, in effetti, l'esecuzione passa avanti e indietro tra le due procedure finché uno dei due termina senza chiamare la continuazione che gli è stata fornita come argomento.
Ho due domande:
- Il mio esempio è un'implementazione appropriata / idiomatica delle coroutine usando le continuazioni?
- L'ottimizzazione della coda di chiamata è obbligatoria per l'implementazione delle coroutine con continuazioni? Nella mia soluzione, passare troppo spesso tra le due coroutine potrebbe causare un overflow dello stack se Scheme non forniva il TCO. Ci sono altre soluzioni che non richiedono TCO?
Modifica
Il commento di Basile sembra essere sufficiente per rispondere alla mia domanda. Lo sfondo della domanda è che mi piacerebbe che questo approccio implementasse le coroutine in Python, dove non ho TCO.