Bucles
Anterior | Capítulo 6. Programar con GEL | Siguiente

## Bucles

### Bucles «while»

Sintaxis:

    while <expression1> do <expression2>
    until <expression1> do <expression2>
    do <expression2> while <expression1>
    do <expression2> until <expression1>

son similares a otros lenguajes. Sin embargo, puesto que GEL es una única expresión que debe devolver algo, estas construcciones devolverán el resultado de la última iteración o `NULL` si no se realiza ninguna operación. En la expresión booleana, `=` se traduce a `==` sólo para la sentencia `if`.

### Bucles «for»

Sintaxis:

    for <identifier> = <from> to <to> do <body>
    for <identifier> = <from> to <to> by <increment> do <body>

bucle en el que el identificador es un conjunto de todos los valores desde `<from>` hasta `<to>`, opcionalmente se puede usar un incremento distinto de 1. Dichos bucles son más rápidos, cómodos y compactos que los bucles normales descritos previamente pero menos flexibles. El identificador se debe tratar como tal y no se puede eliminar su referencia. El valor del identificador corresponde al último valor de éste o a `<from>` si el cuerpo del bucle no se ha evaluado todavía. Se garantiza que la variable permanezca inicializada tras el bucle, de modo que puede usarla sin problemas. Además, `<from>`, `<to>` e `<increment>` no pueden ser valores complejos. Tampoco se garantiza que se alcance `<to>`, pero sí que nunca se rebasará. El ejemplo siguiente imprime todos los números pares desde 1 a 19:

    for i = 1 to 20 by 2 do print(i)

Cuando uno de los valores es un número de coma flotante, la verificación final se realiza con un paso de 2 ^-20. Es decir, incluso si se sobrestima 2 ^-20 veces el «por» por encima, todavía se ejecuta la última iteración. De este modo

    for x = 0 to 1 by 0.1 do print(x)

hace lo esperado aunque sumar 0,1 diez veces es algo superior a 1,0 debido a la forma en que los números de coma flotante se almacenan en la base 2 (no hay 0,1, el número real almacenado es sólo ligeramente más grande). Esto no es perfecto, pero funciona en la mayoría de los casos. Si quiere evitar este problema, utilice números reales racionales, por ejemplo:

    for x = 0 to 1 by 1/10 do print(x)

Esta comprobación se realiza únicamente desde la versión 1.0.16 en adelante, por lo que la ejecución del código puede variar en versiones anteriores.

### Bucles «foreach»

Sintaxis:

    for <identifier> in <matrix> do <body>

ejecuta el cuerpo del bucle para cada uno de los elementos de la matriz recorriendo ésta fila por fila y de izquierda a derecha. Para imprimir los números 1, 2, 3 y 4 en este orden se podría hacer lo siguiente:

    for n in [1,2:3,4] do print(n)

Si desea recorrer las filas y columnas de una matriz puede usar las funciones RowsOf y ColumnsOf que devuelven un vector de filas o columnas de la matriz. Por lo tanto,

    for n in RowsOf ([1,2:3,4]) do print(n)

imprimirá `[1,2]` y después `[3,4]`.

### Parar y continuar

También puede utilizar los comandos `break` y `continue` en un bucle. El comando `continue` reinicia el bucle actual en la siguiente iteración, mientras que el comando `break` sale del bucle actual.

    while(<expression1>) do (
      if(<expression2>) break
      else if(<expression3>) continue;
      <expression4>
    )

Anterior | Subir | Siguiente
Capítulo 6. Programar con GEL | Inicio | Sumas y productos