Quindi so che nello Schema definisce è per scoping dinamico e lasciate per scoping statico, ma la seguente cosa che mi confonde:Scheme Scoping (definire e lasciare)
Se ho
(let ((x 0))
(define f (lambda() x))
(display (f))
(let ((x 1))
(display (f))
)
)
Sarà mostra 00. Fin qui tutto bene. Tuttavia, se aggiungo una definizione aggiuntiva per x in questo modo:
(let ((x 0))
(define f (lambda() x))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
Verrà visualizzato undefined4. Perchè è questo? Perché la definizione di x dopo la valutazione di influisce sul valore restituito di (f)? E perché il valore restituito è "indefinito"?
E 'anche opportuno ricordare che f vincolante con letrec invece di definire funziona anche:
(let ((x 0))
(letrec ((f (lambda() x)))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
)
ritorni 00.
Nota: Ho usato DrRacket con il languge impostato su "abbastanza grande"
Che cosa si intende per "definire è per scoping dinamico nello Schema"? A proposito, a meno che non sia necessario utilizzarlo per un corso, "Pretty Big" è un dialetto obsoleto. – Rhangaun
Scheme usa sempre scope statica, non è corretto affermare che "define is for dynamic e let for scope statico" –
Sono d'accordo con Oscar: la premessa nella domanda è sbagliata, o sta usando il termine sbagliato. – dyoo