(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
?
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
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
@ user1457584 entrambe le versioni non verranno compilate: 'set !: identificatore non associato nel modulo in: leave' – alfasin