Obwohl sowohl als auch set!
einen Wert im selben Bereich neu definieren, führen sie zwei verschiedene Dinge aus, wenn der Bereich anders ist. Hier ein Beispiel:
(define x 3)
(define (foo)
(define x 4)
x)
(define (bar)
(set! x 4)
x)
(foo) ; returns 4
x ; still 3
(bar) ; returns 4
x ; is now 4
Wie Sie sehen können, wenn wir einen neuen lexikalischen Gültigkeitsbereich (wie wenn wir define
eine Funktion) erstellen, werden alle definierten Namen innerhalb dieses Bereichs den Namen Maske, die in dem umschließenden Umfang erscheinen. Dies bedeutet, dass wir, als wir d x
bis 4
in foo
haben, wirklich einen neuen Wert für x
erstellt haben, der den alten Wert überschattet hat. In bar
, da foo
nicht in diesem Bereich existiert, sucht set!
zum umschließenden Bereich, um den Wert x
zu finden und zu ändern.
Auch, wie andere Leute gesagt haben, sollen Sie nur einen Namen einmal in einem Bereich. Einige Implementierungen werden Sie mit mehreren s entkommen lassen, und einige nicht. Außerdem sollten Sie nur set!
für eine Variable verwenden, die bereits d ist. Wie streng diese Regel durchgesetzt wird, hängt wiederum von der Implementierung ab.
Wie würden Sie einen Loop-Zähler in Scheme entwerfen? –