dolist

Mit dem Macro dolist können mehrere Ausdrücke für die Elemente einer Liste ausgeführt werden. Das Macro erwartet sinnvollerweise mindestens zwei Argumente.

(dolist (<variable> <list-form> [<result>])
  <statement> ...)

Das erste Argument wird nicht ausgewertet und steuert die Iteration. Es muss sich dabei um eine Liste handeln. Die Liste besteht aus zwei oder drei Elementen. Das erste Element legt den Namen der Schleifenvariable fest. Wenn das dritte Element angegeben ist, dann legt es das Resultat des gesamten dolist Aufrufs fest. Wenn das dritte Element fehlt, ist das Resultat der Scheife nil.

Alle weiteren Argumente gehen in den Rumpf der Schleife ein.

Beispielsweise wird hier der Rumpf der Schleife für die Werte 1, 2, 3 und 4 der Schleifenvariable el durchlaufen, im Rumpf die Werte von el in der Variablen sum summiert und der Wert von sum als Resultat geliefert:

>(let ((sum 0))
   (dolist (el (quote (1 2 3 4)) sum)
     (setq sum (+ el sum))))
10

Das Macro basiert darauf, dass eine rekursive Funktion erzeugt und ausgeführt wird.

(setq dolist
  (mlambda args
    (let
      ((symbol (first (first args)))
       (list-form (second (first args)))
       (statements (rest args))
       (fn (gensym))
       (rest-list (gensym)))
      (quasi-quote
        (letrec
          (((unquote fn)
            (lambda ((unquote rest-list))
              (if
                (unquote rest-list)
                (progn
                  (let
                    (((unquote symbol) (first (unquote rest-list))))
                    (unquote (cons progn statements)))
                  ((unquote fn) (rest (unquote rest-list))))
                (unquote
                  (aand
                    (rest (rest (first args)))
                    (first it)))))))
          ((unquote fn) (unquote list-form)))))))