2009-04-16 5 views
5

Quindi credo di capire le continuazioni ora, almeno su un certo livello, grazie allo community scheme wiki e Learn Scheme in Fixnum Days.Cerco codice di esempio forzato: continuazioni!

Ma mi piacerebbe più pratica - cioè, più codice di esempio che posso elaborare nella mia testa (preferibilmente ideato, quindi non c'è niente di estraneo da distrarre dal concetto).

In particolare, mi piacerebbe lavorare con più problemi con continuazioni che riprendono e/o co-routine, piuttosto che semplicemente usando per uscire da un ciclo o qualsiasi altra cosa (che è abbastanza semplice).

Ad ogni modo, se conosci dei buoni tutorial oltre a quelli che ho linkato sopra, o se ti piacerebbe pubblicare qualcosa che hai scritto sarebbe un buon esercizio, sarei molto riconoscente!

risposta

5

Sì, le continuazioni possono essere piuttosto avvincenti. Ecco un buon puzzle che ho trovato un po 'indietro - cercare di capire cosa sta stampata e perché:

(define (mondo-bizarro) 
    (let ((k (call/cc (lambda (c) c)))) ; A 
    (write 1) 
    (call/cc (lambda (c) (k c))) ; B 
    (write 2) 
    (call/cc (lambda (c) (k c))) ; C 
    (write 3))) 

(mondo-bizarro) 

spiegazione di come funziona (contiene spoiler!):

  1. I primi call/cc negozi restituisce la propria continuazione e la memorizza in k.
  2. Il numero 1 viene scritto sullo schermo.
  3. La continuazione corrente, che è quello di continuare nel punto B, viene restituito a k, che restituisce alla A
  4. Questa volta, k è ora legato alla prosecuzione siamo arrivati ​​al B
  5. Il numero 1 è scritto di nuovo alla schermata
  6. la continuazione corrente, che è quello di continuare nel punto B, viene restituito a k, che è un altro (ma diversa) prosecuzione ad un altro punto B
  7. Una volta che siamo di nuovo in continuazione originale, è importante notare che qui k è ancora legato a A
  8. Il numero 2 viene scritto nella schermata
  9. La continuazione corrente, che è quello di continuare nel punto C, viene restituito a k, che restituisce alla A
  10. Questa volta, k è ora legato alla prosecuzione abbiamo ottenuto a C
  11. il numero 1 è scritto nuovamente alla schermata
  12. il proseguimento corrente, che è di continuare a punto B, viene restituito k, che ritorna C
  13. il numero 3 viene scritto schermata
  14. And you're done

Pertanto, l'uscita corretta è 11213. Il punto di attacco più comune che ho messo in grassetto: è importante notare che quando si usano le continuazioni per "resettare" il valore di k che non influenza il valore di k nella continuazione originale. Una volta che sai che diventa più facile da capire.

+0

Hmm, sì, questo sta distruggendo il mio cervello. csi dice che il risultato è 11213, ma posso solo capire il '112' ... mi manca qualcosa! –

+1

Ho aggiunto una spiegazione: leggila se sei davvero bloccato. –

+0

Grazie, il punto audace era esattamente dove ero confuso. Fammi provare di nuovo ... :) –