Mario de Lama
malar@arrakis.es
http://www.arrakis.es/~malar
Hay cinco tipos de estructuras condicionales y dos comandos:
SI el resultado de un test es verdadero ENTONCES ejecuta este código FIN
Los test no sólo pueden ser tales sino cualquier algebraico u operación que devuelva un resultado a la pila. Sea cual sea el test se entiende que el resultado es verdadero si en 1: hay un número distinto de 0. El test puede ejecutarse antes de IF:
\<< 1 3 < IF THEN CLLCD "Si: 1 es menor que 3" 1 DISP 7 FREEZE END \>>Programa tonto como el que más que siempre haría que nos apareciera la frase "Si: 1 es menor que 3" en la línea 1 de la pantalla. Aunque sólo sea por legibilidad es mejor esta forma:
\<< IF '1 < 3' THEN CLLCD "Si: 1 es menor que 3" 1 DISP 7 FREEZE END \>>Si nos fijamos un poco veremos que en realidad IF es una etiqueta que posee esta estructura para mejorar su legibilidad, pero quien hace el trabajo es THEN que evalúa lo que hay en 1: y si el resultado es distinto de 0 ejecuta la cláusula que le sigue. Por ejemplo:
\<< IF 'A * 3' THEN CLLCD "Depende de A" 1 DISP 7 FREEZE END \>>THEN toma el algebraico 'A * 3' de la pila y lo evalúa. Si la variable 'A' es un número distinto de 0 aparece el mensaje en la primera línea de la pantalla. Si es 0 no aparece nada. Si no existe esta variable THEN producirá un error: " * Error: Undefined Name". Si 'A' contiene un tipo de dato que produce un error al evaluarse 'A*3', se producirá dicho error y el programa terminará. Finalmente si 'A' contiene otro algebraico o programa este se evalúa y lo que se obtiene se multiplica por 3, este resultado es el que toma THEN (si no es un número real se produce el error: "THEN Error: Bad Argument Type").
Finalmente comentar que tanto si el resultado del test es cierto como si es falso, el programa continúa después de END.
SI el resultado del test es verdadero ENTONCES ejecuta este código SINO ejecuta este otro FIN
El funcionamiento de esta estructura es similar a la anterior con la diferencia de que si el test es falso se ejecuta el código que hay tras ELSE. Ejemplo:
\<< IF 'A < 3' THEN CLLCD "A es menor que 3" 1 DISP 7 FREEZE ELSE CLLCD "A es mayor o igual que 3" 1 DISP 7 FREEZE END \>>Si al evaluar 'A' obtenemos un número mayor o igual a 3 en pantalla aparece "A es mayor o igual que 3"
EN CASO DE
que este test devuelva verdadero ENTONCES haz esto y termina FIN
que este test devuelva verdadero ENTONCES haz esto y termina FIN
.........................................................
que este test devuelva verdadero ENTONCES haz esto y termina FIN
cláusula por defecto
FIN
Un ejemplo:
\<< \-> nivel1 \<< CASE nivel1 TYPE 0 == THEN CLLCD "Es un real" 1 DISP 7 FREEZE END nivel1 TYPE 1 == THEN CLLCD "Es un complejo" 1 DISP 7 FREEZE END nivel1 TYPE 2 == THEN CLLCD "Es una cadena de caracteres" 1 DISP 7 FREEZE END nivel1 TYPE 3 == THEN CLLCD "Es una función real" 1 DISP 7 FREEZE END CLLCD "Esto es un aburrimiento" 1 DISP 7 FREEZE END \>> \>>Este programa toma un objeto de la pila y nos devuelve una cadena de caracteres indicadora de su tipo. Como tenemos que evaluar repetidamente el comando TYPE sobre un mismo objeto es mejor guardarlo en la variable local 'nivel1' de forma que podamos acceder a su contenido cuando lo deseemos. Si nos hemos aburrido de poner cadenas con el tipo podemos crear una cláusula por defecto (en este caso la línea: CLLCD "Esto es un aburrimiento" 1 DISP 7 FREEZE ) de forma que si ninguno de los anteriores test ha devuelto verdadero sea este código el que se ejecute. Si ponemos el número 7,64 en la pila y ejecutamos el programa se ejecutaría: CLLCD "Es un real" 1 DISP 7 FREEZE y el programa continuaría a continuación del último END.
\<< IFERR IF 'A * 3' THEN CLLCD "Depende de A" 1 DISP 7 FREEZE END THEN CLLCD "Has hecho algo mal" 1 DISP 7 FREEZE END \>>Si la variable 'A' no existe o contiene un objeto que produce un error al ser evaluado por THEN el programa no se interrumpe sino que salta a la cláusula THEN de IFERR y se ejecuta esta: CLLCD "Has hecho algo mal" 1 DISP 7 FREEZE . En caso de que no se produzca ningún error esta cláusula no se ejecuta.
\<< 'A*3' \<< "A es distinto de cero" \>> IFT \>>IFT evalúa el algebraico 'A*3', si este devuelve un número distinto de cero evalúa el programa \<< "A es distinto de cero" \>> apareciendo esta cadena en 1:
\<< A 3 * "A es distinto de cero" IFT \>>
\<< A 3 * "A es distinto de cero" "A es cero" IFTE \>>En 1: aparecerá la frase correcta en función del contenido de 'A'