// lección 4

Ciclos

repetir sobre rangos y listas, mientras, continuar y romper.

repetir recorre rangos y listas. El rango 1..6 cuenta de 1 a 5 (el final no se incluye), y |nombre| da nombre al valor de cada vuelta:

repetir (1..6) |numero|
	imprimir(numero)

repetir (frutas) |fruta, indice|
	imprimir("${indice}: ${fruta}")

Para repetir algo un número de veces basta con escribir la cantidad. Un rango solo cuenta hacia adelante; para contar hacia atrás o a saltos se le añade paso:

repetir (3)
	imprimir("¡Hola!")

repetir (3..0, paso = -1) |i|
	imprimir(i)                 // 3, 2, 1

repetir (0..10, paso = 2) |i|
	imprimir(i)                 // 0, 2, 4, 6, 8

mientras repite mientras la condición sea verdadera. Para sumar o restar basta con +=, -=, *=, /= y %=:

var vidas = 3
mientras vidas > 0
	vidas -= 1

repetir sin nada es un ciclo infinito. continuar salta a la siguiente vuelta y romper termina el ciclo más cercano.

Programa completo

04_bucles.cometa
// Repetir acciones con repetir y mientras.

fn inicio()
	// Con un número, repetir hace eso mismo esa cantidad de veces.
	repetir (3) imprimir("¡Hola!")

	// Un rango cuenta desde el primer número hasta antes del segundo.
	imprimir("Cuenta del 1 al 5:")
	repetir (1..6) |numero|
		imprimir(numero)

	// Si el cuerpo es corto, puede ir en la misma línea.
	imprimir("Cuenta atrás:")
	repetir (3..0, paso = -1) |numero| imprimir(numero)
	imprimir("¡Despegue!")

	// repetir también recorre listas.
	var frutas = ["manzana", "pera", "uva"]
	repetir (frutas) |fruta, indice|
		imprimir("${indice}: ${fruta}")

	// Y recorre un texto letra por letra.
	repetir ("sol") |letra|
		imprimir(letra)

	// continuar salta a la siguiente vuelta; romper termina el bucle.
	imprimir("Números pares hasta encontrar uno mayor que 8:")
	repetir (1..100) |numero|
		si numero % 2 != 0
			continuar
		si numero > 8
			romper
		imprimir(numero)

	// mientras repite mientras la condición sea verdadera.
	// x += 1 es lo mismo que x = x + 1 (también hay -=, *=, /= y %=).
	var vidas = 3
	mientras vidas > 0
		imprimir("Vidas: ${vidas}")
		vidas -= 1

	// Sin rango ni lista, repetir es infinito: sal con romper.
	var intentos = 0
	repetir
		intentos += 1
		si intentos == 3
			romper
	imprimir("Intentos: ${intentos}")