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