Programando en USER RPL
Estructuras condicionales

Mario de Lama   malar@arrakis.es

http://www.arrakis.es/~malar

Regresar

Hay cinco tipos de estructuras condicionales y dos comandos:



La estructura IF ... THEN ... END podríamos traducirla como SI ... ENTONCES ... FIN, de forma que explicaríamos su sintaxis:

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.

Inicio


IF ... THEN ... ELSE ... END sería SI ... ENTONCES ... SINO ... FIN, o dicho de otra forma:

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"

Inicio


La estructura CASE ... THEN ... END es un poco más compleja y se utiliza cuando hay más de dos opciones. Se evalúan tantos test como deseemos de forma que el primero que devuelve un resultado verdadero hace que se ejecute el código asociado a él y termina la evaluación de CASE. Traducido sería:

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.

Inicio


IFERR ... THEN ... END es una estructura de captura de errores que traducida sería:
SI SE PRODUCE UN ERROR en este código ENTONCES ejecuta esto FIN
Podemos ver como funciona en este ejemplo:
\<<
  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.

Inicio


IFERR ... THEN ... ELSE ... END sería la estructura anterior a la que se le dota de ELSE. Funciona de la misma forma que IFERR ... THEN ... END salvo que si no se produce ningún error entre IFERR y THEN se ejecuta el código que sigue a ELSE.

Inicio


El comando IFT es una versión compacta de IF ... THEN ... END. En 2: debe estar la cláusula test y en 1: el objeto a ser evaluado. Este comando evalúa el nivel 2: y comprueba el resultado. Si es falso borra el contenido de 1:, si es verdadero lo evalúa. Ejemplo:
\<<
   '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:
El mismo resultado se habría obtenido si el programa fuera:
\<<
   A 3 *
   "A es distinto de cero"
   IFT
\>>

Inicio


IFTE es la versión compacta de IF ... THEN .... ELSE ... END. Ejemplo
\<<
   A 3 *
   "A es distinto de cero"
   "A es cero" 
   IFTE
\>>
En 1: aparecerá la frase correcta en función del contenido de 'A'

Inicio


Regresar