2.2 let, letrec und let*
| (let ((id expr) ...) expr) |
Bei einem let-Ausdruck werden zunächst die exprs aus
den (id expr)-Paaren ausgewertet. Ihre Werte werden dann im
Rumpf-expr für die Namen id eingesetzt. Dabei können
sich die Ausdrücke nicht auf die Namen beziehen.
| (define a 3) |
| (let ((a 16) |
| (b a)) |
| (+ b a)) |
| => 19 |
Das Vorkommen von a in der Bindung von b bezieht sich also auf das a aus der Definition, nicht das a aus dem let-Ausdruck.
| (letrec ((id expr) ...) expr) |
Ein letrec-Ausdruck ist
ähnlich zum entsprechenden let-Ausdruck, mit dem Unterschied, daß sich
die exprs aus den Bindungen auf die gebundenen Namen beziehen
dürfen.
| (let* ((id expr) ...) expr) |
Ein let*-Ausdruck ist ähnlich zum entsprechenden
let-Ausdruck, mit dem Unterschied, daß sich die exprs
aus den Bindungen auf die Namen beziehen dürfen, die jeweils vor dem
expr gebunden wurden. Beispiel:
| (define a 3) |
| (let* ((a 16) |
| (b a)) |
| (+ b a)) |
| => 32 |
Das Vorkommen von a in der Bindung von b bezieht sich also auf das a aus dem let*-Ausdruck, nicht das a aus der globalen Definition.