2012-06-15 10 views
5
(define get-first 
    (lambda (l) 
    (call-with-current-continuation 
     (lambda (here) 
     (set! leave here) 
     (waddle l) 
     (leave (quote())))))) 

(define get-first 
    (lambda (l) 
    (call-with-current-continuation 
     (lambda (here) 
     (set! leave here) 
     (leave (waddle l)))))) 

Per qualcuno non ha familiarità con il libro "Il Seasoned Schemer", get-first, get-next e waddle (ultime due non definiti qui) procedure sono il modello a quanto pare coroutine per iterare attraverso un albero passato a waddle che produce solo foglie. Appena prima di rendimento waddle s' sulla sua seconda-a-ultimo rientro, imposta il punto di rientro per cui sarà sempre e solo restituire il valore puro '() cioè invece di cedere '(), il valore effettivo di waddleè'(), come se fosse una pura funzione da sempre.Seasoned Schemer, get-prossimo, e le funzioni di waddle

Con questo in mente, possiamo vedere quello che get-first set up ... quando waddle restituisce "per davvero", sarà all'interno del call/cc in get-first e poi (leave (quote())) è il valore della get-first (e, a sua volta, questo leave è destinato a tornare a get-next sull'ultima iterazione, pertanto è get-next che restituisce "effettivo" di '()).

Quindi perché la seconda versione non è equivalente, dove il valore waddle di '() sarebbe l'argomento leave?

+0

Nevermind ... la confusione è dovuta al fatto che "lasciare" non è la funzione che io * voglio * che sia, ma la funzione a cui valuta quando viene valutata, che sembra essere da sinistra a destra e quindi prima "waddle" ". Ciò significa che valuta ciò che era appena impostato nella dichiarazione precedente. Morale: fare attenzione quando si utilizzano funzioni soggette a ridefinizione ALL'INTERNO della chiamata alla funzione! Se si trattava di un interprete da destra a sinistra, i waddle sarebbero stati valutati prima che il simbolo lasciato fosse visto come la funzione che lascia ovunque, durante il quale sarebbe impostata su una funzione DIVERSA. Che pasticcio ... – user1457584

+2

Felice di sapere che è stato risolto, ma si prega di postare la risoluzione come risposta (piuttosto che un commento qui), e accettarlo. In questo modo le persone possono vedere la domanda viene risolta senza venire qui. – Bridge

+0

@ user1457584 entrambe le versioni non verranno compilate: 'set !: identificatore non associato nel modulo in: leave' – alfasin

risposta

3

La confusione è perché "leave" non è la funzione che voglio che sia, ma la funzione è restituisce quando esso viene valutato, che sembra essere da sinistra a destra e quindi prima "waddle". Ciò significa che valuta ciò a cui era appena impostato, nella dichiarazione precedente.

Morale: fare attenzione quando si utilizzano funzioni soggette a ridefinizione ALL'INTERNO della chiamata alla funzione! Se si trattava di un interprete da destra a sinistra, il valore waddle veniva valutato prima che il simbolo leave venisse visualizzato come la funzione che "lasciava" ovunque, durante il quale sarebbe stata impostata su una funzione DIVERSA.

+2

Dovresti contrassegnare la risposta alla tua domanda, anche se hai scritto la risposta. Altrimenti compare nella lista senza risposta. –

Problemi correlati