Un nouveau type de boucle

Supposons que le programmeur d'une application particulière soit très attaché à la boucle for du langage C. Il a donc envie d'écrire des expressions du type :

(for (setf i 0) (< i n) (incf i)
     (setf (aref a i) 0))

Voici une macro permettant de le faire :

(defmacro for (start test update &body body)
  `(progn ,start
          (do ()
              ((not ,test))
            ,@body
            ,update)))

Une autre possibilité est de se servir de la macro while définie dans la section précédente :

(defmacro for (start test update &body body)
  `(progn ,start
          (while ,test
            ,@body
            ,update)))

Voici comment s'en servir :

* (for (setf *i* 0) (< *i* 5) (incf *i*)
  (print *i*))

0
1
2
3
4
NIL
*

Attention, l'indentation par défaut proposée par Emacs n'est pas celle indiquée dans l'exemple ci-dessus, car Emacs ne connaît pas l'existence de la macro for. Il convient alors d'apprendre à Emacs cette nouvelle indentation (voir section 5.1). Pour la macro for, il y a trois expressions à indenter spécifiquement. Il faut donc mettre dans le fichier .emacs l'expression Emacs Lisp suivante :

(put 'for 'lisp-indent-function 3)

Dans le cadre de la création d'une application, il sera souvent nécessaire d'apprendre à Emacs l'indentation des macros correspondant aux idiomes de l'application.

Irene DURAND
2011-10-14