Itération arithmétique

L'itération avec loop peut être faite sous contrôle d'une variable d'itération prenant comme valeur une succession de nombres. Il est entre autre possible d'obtenir une suite arithmétique en donnant la valeur initiale et la valeur finale de la variable. La clause correspondante est for. Exemple :

* (loop for i from 1 to 3
        do (print i))

1
2
3
NIL
*

On remarque que la valeur de l'expression loop entière est nil. Dans les exemples de cette section, nous utilisons presque exclusivement des constantes, (1 et 3 dans l'exemple précédent). Il est bien sûr possible de leur substituer des expressions quelconques. Ces expressions sont évaluées une seule fois avant le début des itérations :

* (defparameter *i* 5)

*I*
* (loop for i from 2 to (decf *i*)
        do (print i))

2
3
4
NIL
*

La clause for a trois effets :

Dans l'exemple précédent la variable i est incrémentée de 1. C'est une valeur par défaut qui peut être modifiée par le mot-clé by :

* (loop for i from 2 to 7 by 2
        do (print i))

2
4
6
NIL
*

Si le mot-clé to est remplacé par below la dernière valeur est exclue, ce qui permet de capturer un certain nombre d'idiomes courants :

* (loop for i from 3 below 6
        do (print i))

3
4
5
NIL
*

Il est également possible de décrémenter au lieu d'incrémenter la valeur de la variable d'itération :

* (loop for i from 8 downto 3 by 2
        do (print i))

8
6
4
NIL
* (loop for i from 8 above 5
        do (print i))

8
7
6
NIL
*

Voici quelques autres variations de ce thème utilisant les mots-clés downfrom, upfrom et upto :

* (loop for i upfrom 8 to 10
        do (print i))

8
9
10
NIL
* (loop for i downfrom 8 to 7
        do (print i))

8
7
NIL
* (loop for i from 4 upto 6
        do (print i))

4
5
6
NIL
*

Irene DURAND
2011-10-14