A.13 Boucles :

XLOGO dispose de sept primitives permettant d’effectuer des boucles : repete, repetepour et tantque, pourchaque, repetetoujours, repetetantque et repetejusqua.

A.13.1 Une boucle avec repete


repete n liste_d_instruction


n est un entier et liste_d_instruction est une liste contenant des instruction à exécuter. L’interpréteur LOGO va effectuer n fois les commandes contenues dans la liste : cela évite ainsi de recopier n fois la même instruction !
Ex :
repete 4 [avance 100 tournegauche 90]      # Un carré de côté 100  
repete 6 [avance 100 tournegauche 60]      # Un hexagone de côté 100  
repete 360 [avance 2 tournegauche 1]       # Un euh... 360-gone de côté 2  
                                           # Bref, quasiment un cercle !


compteur


Au sein d’une boucle repete, est définie une variable interne compteur. Celle-ci désigne le numéro de l’itération en cours (la première itération étant numérotée 1).
repete 3 [ec compteur]  
1  
2  
3  

A.13.2 Une boucle avec repetepour

repetepour joue le rôle des boucles for dans d’autres langages de programmation.

repetepour liste1 liste2


Cette boucle consiste à affecter à une variable un certain nombre de valeurs comprises dans un intervalle donné suivant un incrément donné.
liste1 contient trois paramètres : le nom de la variable, la borne initiale, la borne finale.
On peut rajouter un quatrième argument optionnel désignant l’incrément (le pas avec lequel la variable défile). S’il est omis, il est par défaut de 1. Quelques exemples d’utilisation :
repetepour [i 1 4][ec :i*2]  
2  
4  
6  
8  
 
# A présent on fait varier i entre 7 et 2 en descendant de 1.5 à chaque fois  
# noter l’incrément négatif  
# On affiche ensuite i son carré.  
 
repetepour [i 7 2 -1.5 ][ec liste :i puissance :i 2]  
7 49  
5.5 30.25  
4 16  
2.5 6.25

A.13.3 Une boucle avec tantque


tantque liste_a_tester liste_d_instruction


liste_a_tester est une liste contenant une suite d’instruction rendant un booléen. liste_d_instruction est une liste contenant des instructions à exécuter. L’interpréteur LOGO exécutera continuellement liste_d_instruction tant que liste_a_tester rend vrai.
Ex :
 
tantque ["vrai] [td 1]                    # La tortue tourne sur elle-même  
 
# Un exemple qui nous permet d’épeler l’alphabet à l’envers  
 
donne "liste "abcdefghijklmnopqrstuvwxyz  
tantque [non vide? :liste] [ec dernier :liste donne "liste saufdernier :liste]

A.13.4 Une boucle avec pourchaque


pourchaque nom_variable liste_ou_mot commande


Cette primitive permet de décrire tous les éléments d’une liste ou tous les caractères d’un mot puis exécute à chaque fois le contenu de la liste des commandes.
pourchaque "i "XLOGO [ecris :i]  
X  
L  
O  
G  
O  
pourchaque "i [a b c] [ecris :i]  
a  
b  
c

A.13.5 Une boucle avec repetetoujours, repetetjs


repetetoujours,repetetjs liste_instructions


Répète indéfiniment une liste d’instructions.
repetetoujours [av 1 td 1]

Attention : cette primitive est à utiliser avec prudence du fait de la boucle infinie !

A.13.6 Une boucle avec repetetantque


repetetanque liste1 liste2


Répète une séquence d’instructions contenue dans liste1 tant que liste2 est vraie.
La principale différence avec la primitive tantque est qu’ici, la liste d’instructions est exécutée au moins une fois même si le test de sortie est faux.
donne "i 0  
repetetantque [ec :i donne "i :i+1] [:i<4]  
0  
1  
2  
3  
4

A.13.7 Une boucle avec repetejusqua


repetejusqua liste1 liste2


Répète une séquence d’instructions contenue dans liste1 jusqu’à ce que liste2 soit vraie.
donne "i 0  
repetejusqua [ec :i donne "i :i+1] [:i>4]  
0  
1  
2  
3  
4