Volver menú revistas Volver página anterior

El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España para ofrecer los artículos de la revista Amiga World España.

N° 43 - Mayo 1993
Amiga World

CURSO DE AREXX (5ª Parte)


Por Jesús Diez

El pasado mes iniciábamos el comentario de la lista
completa de instrucciones del ARexx por orden alfabético.
Hoy continuaremos a partir del punto en que nos quedamos entonces.

6.- DROP

El cometido de esta instrucción es muy sencillo. Sólo sirve para devolver cualquier variable a un estado sin inicializar. Es decir, si la variable contiene cualquier valor, al aplicarle el "DROP", lo pierde y queda sin contenido. Esto no es lo mismo que decir que pase a contener cero, porque cero ya es un valor, sino que efectivamente la variable deja de serlo a partir de ese momento, liberando el espacio que ocupara en la memoria. Como curiosidad, este proceso en el ARexx provoca un curioso efecto secundario. Como resulta que el ARexx no se necesita la declaración de tipo de variable como en otros lenguajes, porque se asume por el contexto, al hacer un "DROP" de una variable numérica, su valor desaparece y cualquier alusión a la variable se toma como mismo nombre textualmente. Por ejemplo, si tenemos un fragmento de programa:

prueba=17
SAY prueba
DROP prueba
SAY prueba

El primer "say" producirá en pantalla la salida del número 17, pero el segundo escribirá la palabra "PRUEBA", ya que después del "DROP", el ARexx ya no reconoce ninguna variable que se llame "prueba". Por ello, pensará que lo que deseamos escribir es pantalla es una cadena de texto con el nombre de la variable.


7.- ECHO

Esta es una instrucción idéntica al ya conocido "SAY". Es indiferente llamarla con un nombre u otro en los programas, el resultado será el mismo.


8.- ELSE

En algunos ejemplos de capítulos anteriores ya vimos la instrucción "IF", que sirve para expresar bifurcaciones condicionales en el curso de un programa. Si la condición que expresamos en el "IF" se cumple, se ejcutarán la instrucción o instrucciones que le sigan. La sintaxis completa de IF la veremos un poco más adelante, para conservar el orden alfabético del glosario. Con esta estructura del "IF", en el caso de que la condición especificada no se cumpla, el ARexx saltará las instrucciones asociadas al IF y continuará la ejecución del programa a partir de la siguiente instrucción "ELSE", por el contrario, complementa la sintaxis del "IF", y nos permite asociar instrucciones a esta situación, cuando no se cumple la condición inicial. Por ejemplo, si lo aplicamos a un programa que diga si un número es par o impar (usando el operador "//" que ya mencioné en su momento), deberiamos hacer algo así:

/* Programa "par o impar" */
say "Introduce un número:"
pull numero
resto=numero//2
if resto=0 then say "Este número es par."
else say "Este número es impar."
exit

Este pequeño programa, imprime en pantalla si un número es par o impar en función de si el resto de su división por dos es 0, o diferente de 0. El ELSE expresa precisamente esta última condición, es decir, cuando el resto no es 0.

Por último, sólo añadir que después del ELSE se puede colocar más de una instrucción, si se introducen dentro de una estructura "DO-END", tal y como expliqué en el capítulo pasado, al final del apartado dedicado al "DO". Esto es importante, ya que si no se introducen en un "DO-END", el "ELSE" sólo tendrá en cuenta la primera instrucción de la lista. La forma de hacerlo sería:

IF condición THEN instrucción1
ELSE DO
instrucción2
instrucción3
..
END


9.- END

Esta instrucción, ya usada en varias ocasiones, nos sirve para marcar el final de un bucle "DO", o el de un "SELECT". En estructuras de bucles anidados (un bucle dentro de otro), cada "END" se refiere al último DO mencionado. En caso de que se desee especificar este orden de referencia, "END" admite opcionalmente un nombre después de la instrucción con la variable contador del bucle al que nos queremos referir. Por ejemplo:

DO i=1 TO 20
instruccion1
DO n=5 TO 10
instruccion2
..
END n
END i


10.- EXIT

Nos sirve para terminar la ejecución de un programa ARexx desde cualquier punto del listado. Con esto quiero decir que no sólo puede aparecer un "EXIT" al final del listado, tal y como estamos acostumbrados a ver, sino que además podemos tener otros puntos de salida del programa en función de condiciones establecidas por nosotros que puedan representar, por ejemplo. errores en los datos introducidos. Esto se puede hacer simplemente incluyendo estratégicamente instrucciones "IF" del tipo:

IF condición THEN EXIT

En el caso de que tengamos varios puntos de salida del programa, nos interesará quizá saber, en un momento dado, cuál ha sido la instrucción "EXIT" que ha provocado realmente la salida. Para ello "EXIT" admite después del nombre de la instrucción, un valor numérico o una variable que será impreso en pantalla, al terminar el programa. Esta capacidad nos sirve, además, para pasar datos o resultados desde el programa ARexx a una aplicación desde el programa ARexx a un apliación que lo esté utilizando como lenguaje de macros.


11.- IF

Mediante la instrucción "BREAK" podemos forzar la
salida del fragmento de programa en cualquier punto,
retornando la ejecución al listado normal. Esta ins-
trucción no está pensada para un uso habitual, y sus
posibilidades se escapan de la cobertura de este curso

Esta es, probablemente, una de las instrucciones más importantes de cualquier programa. Su estructura ya ha sido mencionada en ejemplo anteriores y resultará muy familiar a los que estén acostumbrados a trabajar con el lenguaje BASIC, ya que se usa de la misma forma. Nos sirve para ejecutar condicionalmente secciones de un programa, de forma que si se cumple la condición especificada, se realizará la instrucción asociada al "IF". En caso de que no se cumpla la condición se ignora la instrucción asociada al "IF", y se procederá con la instrucción asociada al "ELSE", si existe, o con la siguiente instrucción al "IF", si no hay "ELSE". La estructura la podemos representar mediante:

IF condición THEN instrucción

o también:

IF condición THEN instrucción1
ELSE instrucción2

Debo añadir nuevamente que, si se desea asociar más de una instrucción al "IF" o al "ELSE", se debe hacer mediante una estructura "DO-END", de la siguiente manera:

IF condición THEN DO
instrucción1
instrucción2
...
END

De esta forma si se cumple la condición, se ejecutará el DO, que a su vez lanzará las instrucciones que contienen en su interior. En caso contario, si la condición nno se cumple, el bloque completo de instrucciones será ignorado, y se pasará a la siguiente instrucción después del IF (en este caso después del "END").

La forma de expresar las condiciones, y los operadores que se pueden utilizar, ya fueron señalados en la tabla del tercer capítulo. Sólo me quedaría recordar la importancia de usar paréntesis, para asegurarse de que condiciones complejas quedan correctamente planteadas sin ambigüedades.


12.- INTERPRET

Esta instrucción es otra de las pequeñas joyas del ARexx. Su uso en programas normales es poco frecuente, pero la potencia que proporciona al programador avanzado es excepcional.

En su sintaxis debe llevar asociada una cadena de texto, o una variable que guarde un fragmento de programa ARexx. Mediante "INTERPRET", podemos ejecutar el código contenido en la variable, para liego retornar al listado normal. No hay límite en el tamaño del texto que se puede pasar a "interpret", lo que permite afrontar nuevas posibilidades de programación. Por ejemplo, fragmentos de código pueden ser pasados como argumentos a funciones, que una vez guardados en una variable, pueden ser activados mediante esta instrucción INTERPRET.

Mediante la instrucción "BREAK" podemos forzar la salida del fragmento de programa en cualquier punto, retornando la ejecución al listado normal. Como ya digo, esta instrucción no está pensada para un uso habitual, y sus posibilidades se escapan de la cobertura de este pequeño curso.


13.- ITERATE

La presente instrucción, junto con la siguiente ("LEAVE") sirven para complementar la utilización de bucles "DO" iterativos. Si recuerdan, una de las posibilidades de la sintaxis de "DO" servia para crear bucles de programa con contador, de la siguiente manera:

DO contador=1 TO 50
instrucción1
instrucción2
...
END

Mediante el uso de "ITERATE" dentro de un bucle de este tipo, podemos saltar directamente al siguiente ciclo de repetición, incrementando el contador y sin ejecutar en esa vuelta las instrucciones del cuerpo del bucle que queden por debajo. Se verá mejor con un pequeño ejemplo:

/* Busca enteros divisibles por un número dado */
SAY "Introduzca Número y pulse RETURN:"
PULL numero
DO n=1 TO 1000
IF (n//numero)~=0 THEN ITERATE
SAY n "es divisible por" numero
END
EXIT

En este programa, se nos pide que introduzcamos un número por el teclado, y después busca en los 1000 primeros enteros todos los que son divisibles por él. Para ello hace un bucle "DO" con contador (n) desde 1 hasta 1000, que pasa por un "IF" comprobando si el resto de la división no es cero (~=0). Si se cumple la condición significará que el entero no es divisible por el número que le hemos dado, y por lo tanto se ejecutará el "ITERATE", que a su vez saltará esa vuelta del bucle (y con ella el "SAY"), incrementado el contador.

Cuando hay varios bucles "DO" aninados, la sintaxis del "ITERATE" admite además un nombre de variable contador, para que el AREXX pueda saber a qué bucle nos referimos concretamente (como en el caso del END). Cuando sólo hay un bucle, como en el ejemplo anterior, el nombre de la variable es opcional, ya que no hay posibilidad de ambigüedades.


14.- LEAVE

Aquí tenemos otra instrucción complementaria de los bucles "DO". Sirve para forzar la salida de un bucle con contador a la siguiente instrucción después del END. A diferencia del "ITERATE" que sólo salta una de las vueltas del contador, "LEAVE" sale por completo del bucle, abandonando su ejecución inmediatamente.

Nuevamente, y al igual que en el caso anterior, se puede poner el nombre de la variable contador del bucle del que queremos salir, tras el nombre de la instrucción, para evitar problemas en casos de bucles anidados. también su uso es opcional, cuando tratamos con un solo bucle.


15.- NOP

Esta es otra curiosa instrucción el ARexx. Su sorprendente cometido es no hacer NADA. pese a esto esta instrucción es muy valiosa para completar la estructura lógica de las comparaciones "IF-THEN-ELSE", y evitar conflictos en los emparejamientos de los "ELSE" con su "IF" correspondiente. Una vez más, espero que sea capaz de explicarlo mejor con un ejemplo, Si tenemos una comparación del tipo:

IF condición1 THEN
IF condición2 THEN instrucción1
ELSE instrucción2

Si se cumple la condición1, se ejecutará el "IF" de la condición2. A su vez, si se cumple la condición2, entonces se ejecutará la instrucción1. Hasta aquí todo iría bien, pero el problema surge con el "ELSE". Supongamos que deseamos que la instrucción2 se ejecutará cuando no se cumpliera la condición1, es decir asociada al primer "IF". En este caso este esquema no nos serviría, ya que cada "ELSE" se asocia al último "IF", con lo que la instrucción2 se ejecutaría sólo cuando no se cumpliera la condición2. ¿Cómo deberíamos escribir este fragmento de código? Aquí es donde entra la instrucción NOP. El resultado quedaría así:

IF condición1 THEN
IF condición2 THEN instrucción1
ELSE NOP
ELSE instrucción2

De esta forma, todo ocurrirá según deseamos, ya que el "ELSE NOP" se asocia al segundo "IF", y nos asegura que el segundo "ELSE se ejecuta cuando no se cumpla la primera condición.


16.- NUMERIC

Mediante esta instrucción podemos variar aspectos del formato numérico que usará el ARexx en los cálculos. Se puede usar de tres formas. Por un lado sirve para modificar la apariencia con la que los valores numéricos son impresos en pantalla:

NUMERIC FORM SCIENTIFIC

De esta forma los números decimales que necesitan notación exponencial se ajustan para que la mantisa varíe entre 1 y 10 (formato científico). Esta es la opción por defecto.

NUMERIC FORM ENGINEERING

Esta instrucción hace que los números en notación exponencial se ajusten para tener el exponente con múltiplo de 3 y la mantisa entre 1 y 1000 (formato técnico o de ingeniería). Los otros dos usos son:

NUMERIC FORM DIGITS n

Sirve para indicar el número (n) de dígitos de precisión que se han de usar en todos los cálculos.

NUMERIC FUZZ n

Esta otra opción es un poco más especial y sirve para especificar el número (n) de dígitos que deben ser ignorados en las operaciones de comparación numérica. Obviamente, "n" debe de ser un número entero y menor que el especificado en DIGITS.

Estos formatos deben ajustarse al principio del programa, y antes de que se realice cualquier cálculo numérico. Si se desea cambiar de formato un número ya calculado, se usa el operador "+" delante. En la tabla de operadores del capítulo 3, recordarán que el operador "*" aparecía dos veces, una como operador de suma y otra como operador para cambio de formato numérico, con diferente prioridad. Por ejemplo, pruebe el siguiente listado:

/* Prueba de NUMERIC */
n=1/12345678912
NUMERIC FORM ENGINEERING
SAY +n
NUMERIC FORM SCIENTIFIC
SAY +n
NUMERIC DIGITS 2
SAY +n

Al ejecutarlo, podrán comporbar el efecto de las tres primeras formas de la instrucción "NUMERIC", representando el mismo número de maneras diferentes.

hasta aquí hemos llegado por hoy. En junio volveré a estar con ustedes con nuevos comandos que completarán el glosario de instrucciones. Reciban saludos cordiales y hasta pronto.


Volver menú revistas Volver página anterior