dotimes

Mit dem Macro dotimes können mehrere Ausdrücke wiederholt ausgeführt werden. Das Macro erwartet sinnvollerweise mindestens zwei Argumente.

(dotimes (<variable> <count-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. Diese wird ausgehend vom Wert 0 nach jedem Durchlauf der Schleife um eins erhöht. Die Schleife wird wiederholt, solange der Wert kleiner als das zweite Element der Liste ist. Wenn das dritte Element angegeben ist, dann legt es das Resultat des gesamten dotimes 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 0, 1, 2, ... bis 9 der Schleifenvariable i durchlaufen und der Wert von p als Resultat geliefert:

>(let ((p 1))
   (dotimes (i 10 p)
     (setq p (* p (+ 1 i)))))
3628800

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

(setq dotimes
  (mlambda args
    (let
      ((symbol (first (first args)))
       (count-form (second (first args)))
       (statements (rest args))
       (fn (gensym)))
      (quasi-quote
        (letrec
          (((unquote fn)
            (lambda ((unquote symbol))
              (if
                (less? (unquote symbol) (unquote count-form))
                (progn
                  (unquote (cons progn statements))
                  ((unquote fn) (+ 1 (unquote symbol))))
                (unquote
                  (aand
                    (rest (rest (first args)))
                    (first it)))))))
          ((unquote fn) 0))))))