Con la expresión loop, las expresiones del bloque de bucle se repiten en cada iteración del bucle.
El GIF de abajo del gesto "Barrido y cuenta nueva" de Fortnite es un ejemplo de cómo funciona un loop. El GIF se reproduce hasta el final, luego se repite desde el principio, y el jugador que usa gestos es como las expresiones en un bloque de bucle.
# GIF
loop:
DoCleanSweepEmote()
Al igual que un GIF, un bloque de bucle se repetirá para siempre a menos que se le indique lo contrario. Es lo que se conoce como bucle infinito.
Los bucles infinitos no son muy útiles en la mayoría de los casos, ya que bloquearán el progreso del programa, por lo que Verse proporciona una forma de finalizarlos o suspenderlos.
- Finalización: Puedes finalizar un bucle saliendo con
breakoreturn. - Suspensión: Puedes suspender un bucle si este se utiliza en un expresión
async. Consulta Acerca de la concurrencia para más detalles.
También es posible hacer ambas cosas en el mismo bucle. En este ejemplo, el bloque de bucle se repite hasta que el número aleatorio que se genera es inferior a veinte.
loop:
## generar número aleatorio
RandomNumber : int = GetRandomInt(0, 100)
# marcar si el número aleatorio es menor que veinte
if (RandomNumber < 20):
#salir del bucle
break
Sintácticamente, esto es lo mismo que:
expression0
loop:
expression-block
if (test-arg-block):
break
expression-block
expression2
A diferencia de otras expresiones de flujo de control, la expresión de bucle devuelve void, por lo que puede no ser útil en los casos en los que se desee que una expresión devuelva un resultado. Si el bucle está dentro de una función, entonces es posible devolver un valor con return, pero esto saldrá no sólo del bucle sino también de la función.
Expresiones de bucle anidado
Puedes anidar un bucle dentro de otro bucle. El primer bucle se llama a veces bucle exterior, y el segundo bucle se llama bucle interior. Cuando se ejecuta la expresión break en un bucle interno, solo se rompe fuera del bucle interno.
En el ejemplo siguiente, el bucle exterior continúa con la expresión 3 y luego con la expresión if después de salir del bucle interior, y puede ejecutar la expression1 y el bucle interior de nuevo.
expression0
# bucle exterior
loop:
expression1
# bucle interior
loop:
expression2
if (test-arg-block0):
# salir de bucle interior
break
expression3
if (test-arg-block1):
# salir de bucle exterior
break
expression4