On this page:
let
letrec
let*

2.2 let, letrec und let* 🔗

syntax

(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.

syntax

(letrec ((id expr) ...) expr)

Ein letrec-Ausdruck ist ähnlich zum entsprechenden let-Ausdruck, mit dem Unterschied, dass sich die exprs aus den Bindungen auf die gebundenen Namen beziehen dürfen.

syntax

(let* ((id expr) ...) expr)

Ein let*-Ausdruck ist ähnlich zum entsprechenden let-Ausdruck, mit dem Unterschied, dass 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.