Sentencia FROM

FROM <variable>=<constante> TO <constante>;
    <sentencia> ;
    ...
END

(o bien)

FROM <variable>=<constante> TO <constante> STEP <constante>;
    <sentencia> ;
    ...
END

La sentencia FROM es una sentencia que implementa un bucle, es decir, que es capaz de repetir un grupo de sentencias un número determinado de veces.

Para implementar este bucle se necesita una variable GLOBAL, LOCAL o PRIVATE del propio proceso que sirva como contador del bucle.

Antes de las sentencias que conformarán el grupo interior de sentencias se debe poner la palabra reservada FROM seguida del nombre de la variable contador, el símbolo de asignación (=), el valor inicial de la variable, la palabra reservada TO y, finalmente, el valor final de la variable. Tras esta declaración del bucle FROM se debe poner el símbolo ; (punto y coma).

Después de esta cabecera definiendo las condiciones del bucle vendrá el grupo interior de sentencias que se pretende repetir un número determinado de veces y, al final, la palabra reservada END.

Se denomina iteración del bucle el número de veces que se ejecuta el grupo interior de sentencias.

La primera iteración se hará con el valor incial en la variable usada como contador, tras esta iteración se le sumará 1 a esta variable (si el valor inicial es menor que el valor final) o se le restará 1 (en caso contrario). Tras actualizar el valor de la variable, se pasará a la siguiente iteración siempre que el valor de dicha variable no haya llegado (o sobrepasado) el valor final del bucle.

Como segunda acepción de la sentencia FROM se puede poner tras los valores inicial y final de la sentencia la palabra reservada STEP seguida de un valor constante que indique el incremento de la variable contador tras cada iteración del bucle, en lugar de 1 o -1, que son los incrementos que se harán por defecto si se omite la declaración STEP (paso).

A continuación, se muestra un programa con dos bucles FROM, uno sin declaración STEP (con incremento o decremento por defecto) y otro con ella.

Ejemplo:
PROGRAM mi_juego;
BEGIN
    FROM x=9 TO 0;
        // sentencias interiores ...
    END
    FROM x=0 TO 9 STEP 2;
        // Sentencias interiores ...
    END
END


El primer bucle se ejecutará 10 veces con la variable x valiendo desde 9 hasta 0 en las diferentes iteraciones; por defecto, se le resta uno a la variable cada vez, ya que el valor inicial (9) es mayor que el valor final (0).

En el segundo, se indica como incremento de la variable la constante 2, por lo que el bucle se ejecutará 5 veces con la variable x valiendo 0, 2, 4, 6 y 8, respectivamente, en las sucesivas iteraciones. Como se puede observar no se hará ninguna iteración con x valiendo 9, aunque éste sea el valor final del bucle.

Por defecto, si no se hubiera especificado como STEP (paso) del bucle 2, se le habría sumado 1 a la variable x tras cada iteración.

Un bucle FROM siempre se puede realizar también con la sentencia FOR, como se muestra a continuación (con dos bucles equivalentes a los del ejemplo anterior).

Ejemplo:
PROGRAM mi_juego;
BEGIN
    FOR ( x=9 ; x>=0 ; x=x-1 )
        // Sentencias interiores ...
    END
    FOR ( x=0 ; x<=9 ; x=x+2 )
        // Sentencias interiores ...
    END
END


Los valores inicial y final de un bucle FROM deben ser diferentes.

Si el valor inicial es menor que el valor final, no se puede especificar un valor negativo en la declaración STEP.

Si el valor inicial es mayor que el valor final, no se puede especificar un valor positivo en la declaración STEP.

Una sentencia BREAK dentro de un bucle FROM lo finalizará de forma inmediata, continuando el programa por la sentencia siguiente a dicho bucle (tras el END).

Una sentencia CONTINUE dentro de un bucle FROM forzará al programa a incrementar inmediatamente la variable usada como contador y, después, si no se ha sobrepasado el valor final, comenzar con la siguiente iteración.

Las sentencias interiores a un bucle FROM pueden ser tantas como se quiera y de cualquier tipo, incluyendo, por supuesto, nuevos bucles FROM.


Ver: Sintaxis