| 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 |
|
CURSO DE AREXX (5ª Parte) |
|
Por Jesús Diez El pasado
mes iniciábamos el comentario de la lista 6.- DROPEl 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:
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.
|
|
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.
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.
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.
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.
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.
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 |