Los bloques FUNCTION

Los nuevos bloques FUNCTION se comportan de forma análoga a las funciones de otros lenguajes de programación, se ejecutan de forma secuencial (y no en paralelo como los bloques PROCESS), no retornando hasta que no han terminado.

FUNCTION <nombre> ( <parámetros> )
<Declaración de datos privados>
BEGIN
    <sentencia> ;
    ...
END

Estos bloques seguirán funcionando de forma muy similar a los procesos normales, pero con una importante diferencia: detendrán al proceso llamador hasta finalizar, es decir, que estas funciones dormirán al proceso que las ha llamado, hasta que estas funciones retornen o su proceso finalice.

Si la función no utiliza sentencias FRAME, se comportará igual que un proceso normal, pero si una función ejecuta la sentencia FRAME, no volverá al bloque que la llamó (como lo haría un proceso normal).

Por lo tanto, una función siempre puede devolver un valor con RETURN(<expresión>), incluso después de haber dado uno o varios FRAME.


Programación secuencial.

No se recomienda programar sólo con funciones y de forma secuencial, pero el conocer cómo se puede hacer facilitará el entendimiento de la programación DIV a programadores de otros lenguajes.

Es posible hacer un programa al estilo de la programación tradicional utilizando exclusivamente los bloques FUNCTION, de esta forma únicamente habrá un proceso en ejecución en cada momento.

Al programar de esta forma, la sentencia FRAME se convierte en la orden explícita de volcado a vídeo. Logicamente, si sólo hay un proceso ejecutándose, cuando este ejecute esta orden el sistema mostrará la siguiente imagen del programa.

Pero, programando asi, ¿se podrían mostrar varios gráficos en pantalla?.

La respuesta es sí, ya que se podrían crear una especie de mini-procesos que funcionaran como una instrucción del estilo "pinta un gráfico para la siguiente imagen" (a diferencia de las funciones como put(), que pintan un gráfico para siempre).

Para mostrar un gráfico en la siguiente imagen se debe construir un proceso que reciba los parámetros visuales necesarios y simplemente ejecute una única sentencia FRAME, por ejemplo:

PROCESS pinta_gráfico(x,y,graph)
BEGIN
FRAME;
END

Al llamar a este proceso se crearía un proceso temporal que se pintaría en la siguiente imagen y entonces desaparecería. Podrían contemplarse otros parámetros (además de x, y, z), como file, size, angle, z, ... (ver los datos locales predefinidos).

Claro que, al programar de esta forma, se debería crear (normalmente en una estructura global) una tabla de sprites de forma que el programa pudiera gestionar todos los gráficos. Esto, que puede parecer complicado, es la forma natural de programar los juegos en cualquier otro lenguaje que no sea DIV.


Aplicaciones en el programa principal.

Las sentencias que aparecen entre las palabras BEGIN y END del programa principal (tras las declaraciones de datos), controlan el proceso principal del programa. Este es el encargado de inicializar el programa, realizar las presentaciones, controlar los bucles de menú, los bucles de juego (creando los procesos necesarios), y finalizar el programa.

En el programa principal, puede ser muy útil llamar a bloques FUNCTION. Ya que de esta forma será detenido el programa principal mientras se ejecuta la parte que controla dicha función.

Por ejemplo, la secuencia de presentación podría hacerse en una función, el menú de opciones en otra, etc. Además, se recuerda que las funciones pueden al finalizar, devolver siempre un valor con RETURN(<expresión>), lo cual puede ser también útil para que, por ejemplo el menú, devuelva el número de opción que ha sido seleccionada.

Nota: Que finalice la ejecución del código principal no implica que finalice la ejecución del programa, pues ésta continuará si quedan procesos vivos; si se quiere forzar la terminación del programa cuando finalice este código, se puede utilizar, por ejemplo, la función let_me_alone() justo antes del END del código principal, o bien la función exit() (en cualquier punto del programa).


Ver: Los bloques PROCESS - Sintaxis