Continuazioni, coroutine e ottimizzazione della coda di chiamata

0

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:

  1. Il mio esempio è un'implementazione appropriata / idiomatica delle coroutine usando le continuazioni?
  2. 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.

    
posta Giorgio 06.07.2014 - 20:57
fonte

1 risposta

1

Come ho commentato:

  • sì, il tuo esempio è un'implementazione appropriata delle coroutine usando le continuazioni.

  • sì, l'ottimizzazione della coda di chiamata è obbligatoria per l'implementazione di coroutine con continuazioni.

risposta data 12.07.2014 - 09:22
fonte

Leggi altre domande sui tag