alambda

Bei alambda handelt es sich um ein anaphorisches Macro, das anonyme Funktionen erzeugt.

Es erwartet zwei Argumente, die beide nicht ausgewertet werden. Das erste Argument ist die Parameterliste der zu erzeugenden Funktion. Das zweite Argument ist der Rumpf der Funktion.

Der Unterschied zu lambda besteht darin, dass die Funktion in einer Umgebung erzeugt wird, in der sie selbst an das Symbol self gebunden ist. Auf diese Weise ist es möglich, rekursive anonyme Funktionen zu erzeugen. Ein Beispiel dafür die die Fakultätsfunktion:

(alambda (n)
  (if
    (equal? n 1)
    1
    (* n (self (- n 1)))))

Das Macro basiert im Wesentlichen auf letrec und lambda.

(setq alambda
  (mlambda args
    (quasi-quote
      (letrec
        ((self
          (lambda (unquote (first args))
            (unquote (second args)))))
        self))))