Itération conditionnelle

Dans les sections précédentes, chaque expression du corps de la boucle est évaluée à chaque itération. Cette expression peut bien sûr être une expression conditionnelle Common Lisp normale. Par contre, il est impossible de mettre des clauses d'accumulation à l'intérieur d'une telle expression Common Lisp, car toutes les clauses doivent figurer immédiatement comme arguments de loop ou imbriquées avec des règles assez précises. Pour cette raison, loop contient des clauses correspondant aux conditionnelles simples Common Lisp comme if, when et unless. Le mot-clé de ces clauses est suivi d'une expression arbitraire qui sert de test, puis d'une clause non conditionnelle ou bien d'une autre clause conditionnelle ou encore d'une clause d'accumulation. Dans le cas de la clause if, on peut aussi employer le mot-clé else. Exemples :

* (loop for i from 3 to 8
        when (oddp i)
          sum i)

15
* (loop for i from 3 to 8
        if (oddp i)
          minimize i
        else
          do (format t "here it is: ~a~%" i))
here it is: 4
here it is: 6
here it is: 8
3
*

Plusieurs clauses peuvent être regroupées dans une branche de la clause conditionnelle avec le mot-clé and :

* (loop for i from 3 to 8
        if (oddp i)
          minimize i
          and do (format t "~a~%" (sin i))
        else
          do (format t "here it is: ~a~%" i))
0.14112
here it is: 4
-0.9589243
here it is: 6
0.6569866
here it is: 8
3
*

Irene DURAND
2011-10-14