Avec l'expression loop, les expressions du bloc de boucle sont répétées à chaque itération de la boucle.
Le GIF ci-dessous de l'emote Clean Sweep de Fortnite montre comment fonctionne une expression loop. Le GIF est lu jusqu'à la fin, puis se répète depuis le début, et l'emote du joueur émule les expressions dans un bloc de boucle.
# GIF
loop:
DoCleanSweepEmote()
À l'instar d'un GIF, un bloc de boucle se répète indéfiniment, sauf instruction contraire. Cela s'appelle une boucle infinie.
Les boucles infinies ne sont généralement pas très utiles car elles bloquent la progression du programme ; voilà pourquoi Verse dispose d'un moyen d'y mettre fin et/ou de les suspendre.
- Fin : vous pouvez mettre fin à une boucle avec une expression
breakoureturn. - Suspension : vous pouvez suspendre une boucle si elle est utilisée dans une expression
async. Consultez la rubrique Aperçu de la concurrence pour en savoir plus.
Il est également possible de faire les deux à la fois dans une même boucle. Dans cet exemple, le bloc de boucle se répète jusqu'à ce que le nombre aléatoire généré soit inférieur à vingt.
loop:
# générer un nombre aléatoire
RandomNumber : int = GetRandomInt(0, 100)
# vérifier si le nombre aléatoire est inférieur à vingt
if (RandomNumber < 20):
# sortie de la boucle
break
D'un point de vue syntaxique, cela équivaut à :
expression0
loop:
expression-block
if (test-arg-block):
break
expression-block
expression2
Contrairement à d'autres expressions de flux de contrôle, dans la mesure où l'expression loop renvoie void, elle peut ne pas être utile dans les cas où vous souhaitez qu'une expression renvoie un résultat. Si la boucle se trouve à l'intérieur d'une fonction, il est possible de renvoyer une valeur avec return, mais cette action quitte non seulement la boucle, mais aussi la fonction.
Expressions de boucle imbriquée
Vous pouvez imbriquer une boucle dans une autre boucle. La première boucle est parfois appelée la boucle extérieure et la deuxième boucle la boucle intérieure. Lorsque l'expression break est exécutée dans une boucle intérieure, elle ne s'interrompt qu'en dehors de la boucle intérieure.
Dans l'exemple ci-dessous, la boucle extérieure se poursuit jusqu'à expression3, puis jusqu'à l'expression if après la sortie de la boucle intérieure et peut exécuter à nouveau expression1 et la boucle intérieure.
expression0
# boucle extérieure
loop:
expression1
# boucle intérieure
loop:
expression2
if (test-arg-block0):
# sortie de la boucle intérieure
break
expression3
if (test-arg-block1):
# sortie de la boucle extérieure
break
expression4