|
|
|||||||||
| 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. |
| CURSO DE AREXX (4ª PARTE) | ![]() |
|---|
|
Por Jesús Diez
GLOSARIO DE INSTRUCCIONES.1.- ADRESS En el primer capítulo ya comenté la capacidad de control de aplicaciones que tiene el ARexx. Cuando el intérprete del programa encuentra una instrucción o función que no le pertenece, no emite un mensaje de error, sino la transfiere al programa que esté activo en ese momento. Aquí es donde esta la instrucción ADDRESS. Mediante ella le indicamos al ARexx a dónde debe enviar las instrucciones que no le pertenezcan, o lo que es lo mismo le indicamos el programa que deseamos usar por "control remoto". Todas las aplicaciones que soportan ARexx, tienen una puerta abierta al sistema operativo por donde reciben las órdenes desde el ARexx que recibe el nombre "puerto ARexx". Cada puerto ARexx tiene un nombre que lo identifica de forma única. Con ADRESS especificamos el nombre del puerto que deseamos utilizar. Por ejemplo, si decimos ADDRESS "rexx_ced", le estamos indicando al ARexx que cuando encuentre algo que no sea suyo lo envíe al puerto de comunicación con el popular programa editor de textos, Cygnus. Cada aplicación con soporte ARexx tiene un nombre único para su puerto ARexx, que debe de ser consultado en el manual que lo acompaña. Es más, cada programa entenderá determinadas instrucciones propias descritas en su documentación. Por ello y puesto que no hay ninguna aplicación con soporte ARexx en el software del sistema que esté en posesión de todos los usuarios de Amiga, no voy a insistir mucho en este punto. Cuando alguien desee manejar alguno de sus programas desde el ARexx, solo tiene que indicar mediante ADDRESS el nombre del puerto de comunicación, y luego usar las instrucciones propias de ese programa cuando lo desee, con la seguridad de que el ARexx se encargará de hacerselas llegar. Solo voy a facilitar un pequeño ejemplo que podrá ser utilizado por los poseedores del editor anteriormente mencionado, el Cygnus Editor. Para usarlo solo hay que arrancar el Cygnus, y sin hacer más, arrancar el siguiente script de ARexx desde una ventana shell. No olviden la línea de comentario inicial. /* Prueba de macro para Cygnus */
address "rexx_ced"
Open "s:startup-sequence"
Do i=1 to 10
Jump to line i
Center line
end
exit
Tras unos segundos, el programa se habrá cargado y ejecutado, y si volvemos a la pantalla del ARexx nos encontraremos con que el Cygnus habrá cargado el fichero de la startup-sequence y habrá centrado en la pantalla sus diez primeras líneas, sin que nosotros hayamos hecho nada directamente en el editor, salvo arrancarlo. Curioso, ¿verdad? En este programa hay tres instrucciones que no son del ARexx que son "Open", "Jump to line" y "Center line" que son enviadas al puerto activo, en este caso "rexx_ced" que la transmite al Cygnus para que sea él quién las ejecute. En este script aparece además otro uso de la instrucción "Do" diferente a la que utilizamos hace un par de capítulos. En este caso establecimos un bucle entre el Do y el end, en el que hacemos que una variable llamada "i" baya variando su valor desde 1 hasta 10. Ya veremos en profundidad el uso de Do unas cuantas líneas más adelante en el artículo. Cuando usamos más de un puerto ARexx en el mismo script, se puede usar ADDRESS sin más (sin nombre), para volver al puerto usado previamente al último cambio. Por ejemplo si empezamos usando un ADDRESS "puerto1", y más adelante cambiamos a ADDRESS "puerto 2", en otro punto posterior del listado podremos volver a usar el "puerto1" haciendo simplemente ADRESS. De esta forma se puede hacer referencia a dos aplicaciones sin necesidad de dar explicitamente el nombre de un puerto cada vez. Por último, solo mencionar que existen un puerto de comunicación con el AmigaDOS. El nombre del puerto es "COMMAND". Mediante él, si usamos algún nombre de comando AmigaDOS en un script, el ARexx se encargará de enviarlo al sistema para que lo ejecute. Prueben lo siguiente: /* Forma de enviar comandos al AmigaDos */ Al arrancar este programa meidante RX, se nos preguntará el directorio que queremos obtener (por ejemplo "df0:") mediante la línea "Introduzca path:". Tras teclearlo y pulsar return, el texto se guardará en la variable "nombre". En la siguiente línea aparece la instrucción dir que no pertenece al ARexx, sino que es un comando del AmigaDOS, por lo que se envía al puerto "COMMAND", que lo ejecuta en la ventana de Shell. Esta posibilidad añade una potencia excepcional al sistema operativo, permitiendo realizar de forma automática complejas tareas sumando las capacidades del ARexx y el AmigaDOS.
Esta instrucción sirve para recoger valores desde la línea de arranque de un programa ARexx. Se usa seguido de una lista con nombres de variables, dónde se guardarán los valores recogidos que, por supuesto, pueden ser tanto texto como numéricos. Por ejemplo: /* Exponenciación */
ARG base exponente
say "El resultado de " base "elevado a" exponente "es: " (base**exponente)
exit
Si grabamos este programa con el nombre "calculo.rexx", y posteriormente lo arrancamos mediante: rx calculo.rexx 4 5 obtendremos: El resultado de 4 elevado a 5 es 1024
Si se fijan verán que ARG ha tomado los dos números que acompañaban al nombre del programa en el arranque y los ha guardado en las variables "base" y "exponente", operando después con ellas. Cuando realicen pruebas pasando texto a una variable mediante ARG, comprobarán que el texto se traduce siempre a mayúsculas al guardarse en la variable, independientemente de cómo se haya escrito. Esto puede ser beneficioso o no según el caso (beneficioso por ejemplo para unificar la forma de teclear opciones a un programa), si no se desea ningún cambio, se debe usar la instrucción PARSE que ya estudiaremos en otro momento.
Esta instrucción sirve para salir de la ejecución de un bucle DO o INTERPRET (no visto todavía). En ejemplos y capítulos anteriores hemos visto que los bucles DO se ejecutan cíclicamente mientras se cumpla la condición expresada a su inicio. Mediante BREAK podemos obviar es condición y hacer saltar la ejecución del programa a la instrucción siguiente al "end" del final del bucle, Una forma de usarlo sería en una instrucción "IF" que forme parte de las líneas del inferior del bucle, de la siguiente manera: ...
do while condición
IF n=2 then BREAK
...
resto del bucle
...
end
...
Mediante esta estructura, podríamos salir del DO, sin tener en cuenta la condición inicial, si por ejemplo la variable "n" es igual a 2. Esto es útil para detectar condiciones complejas que no pueden ser definidas en una sola expresión detrás del DO.
Esta es una de las instrucciones más potentes del ARexx. Permite llamar a una función de una librería tanto interna como externa. Como todavía no hemos hablado de las funciones de librería, no se preocupen si no la comprender. En inevitable para dar consistencia a la lista de instrucciones, tener que mencionar prematuramente aspectos avanzados, por ello no den demasiada importancia ahora a la definición de CALL, y vuelvan sobre ella más adelante cuando su uso vaya adquirieindo más sentido. Únicamente señalar, para evitar posibles confusiones, que CALL no se utiliza para las funciones definidas dentro del programa. Las funciones definidas en el listado se llaman como ya vimos en el segundo capítulo. CALL sirve para llamar a cualquier función de la librería interna, o de cualquier otra librería externa que resida en el directorio "libs" de nuestro disco de arranque (previa instalación con ADDLIB). La forma de usarla es: call funcion,argumento,argumento,... Lo importante de acceder a las funciones con CALL es que el valor que devuelve la última función llamada se almacena en una variable especial denominada RESULT, desde donde podemos usarlo. Si por algún motivo se produce un error en la llamada, la variable RESULT no solo no tendrá ningún valor asignado, sino que además quedará sin definir. Esto proporciona un método sencillo de comprobar los errores mediante una línea del tipo: if ~result then say "Error" Esta instrucción comprueba si existe la variable RESULT después de cualquier llamada a una función de librería.
Esta instrucción es el sistema principal de generar bucles en la ejecución de un programa ARexx. Las instrucciones situadas entre el DO del inicio y el end final, se repiten indefinidamente mientras se cumpla la condición expresada después del DO. Los bucles pueden anidarse, uno dentro de otro, tantas veces como se quiera. Ya hemosvisto algunos usos, pero ahora comprobaremos lo potente que puede llegar a ser su sintaxis. Se pueden usar expresiones condicionales mediante dos modalidades: DO WHILE condición ó DO UNTIL condición. DO WHILE ejecuta el bucle MIENTRAS se cumpla la condición. Por otra parte DO UNTIL se ejecuta HASTA que se cumpla la condición. Si quisiéramos imprimir en pantalla los cinco primeros números podríamos hacerlo así: n=0
DO WHILE n<=5
say n
n=n+1
end
pero obtendríamos el mismo resultado con: n=0
DO UNTIL n=6
say n
n=n+1
end
En muchos casos se puede usar de un modo u otro, a elección del programador. Lo habitual es usar la forma más clara de expresar la condición según el contexto. Otra forma del DO es similar al FOR-NEXT del BASIC, puesto que permite la inicialización de una variable que sirve como contador. Siguiendo con nuestro ejemplo de imprimir las cinco primeras cifras, podríamos simplificar la tarea aún más, usando esta nueva estructura así: DO n=1 to 5
say n
end
En este caso el bucle funcionará cinco veces, mientras el Do cuente de uno a cinco. La variable "n" sirve de contador, y va cambiando de valor a la entrada de cada ciclo: primero vale 1, luego cuando se llega al end, valdrá 2, y así sucesivamente. Cuando el DO detecta que se ha llegado al valor especificado como límite, saltará a la siguiente instrucción después del end. Esta estructura además permite especificar un incremento variable mediante la extensión BY. Por ejemplo, si ahora deseamos imprimir los 10 primeros números pares, podríamos hacer: DO n=0 TO 10 BY 2
say n
end
Otra posible extensión es FOR, que nos permite indicar el máximo número de iteraciones que deseamos en el bucle. Por ejemplo: DO While (condición) FOR 5 ejecutará el bucle mientras se cumpla la condición, pero no más de cinco veces. Si se desea un bucle infinito se puede hacer mediante: DO FOREVER
...
end
Para salir de un bucle de este tipo, solo podríamos hacerlo mediante la instrucción BREAK ya mencionada. En este caso, las condiciones de salida del bucle deberíamos chequearlas nosotros mediante IF condición THEN break. (Para ser exactos también serviría la instrucción LEAVE que es tema de otro capítulo). Por si fuera poco todas lasopciones pueden mezclarse, para simular condiciones realmente complejas. Por ejemplo: DO i=7 TO limite BY 2 UNTIL contador>30 Este hipotético bucle se ejecutaría contando de dos en dos desde 7 hasta el valor de la variable "limite" o hasta que la supuesta variable "contador" supere el valor de 30. Para terminar con el Do, mencionar que también sirve para ejecutar un grupo de instrucciones a la salida de un IF-THEN, en vez de una sola instrucción. Es decir, en vez de: IF condición THEN instrucción podemos hacer: IF condición THEN DO
instrucción 1
instrucción 2
...
end
Y hasta aquí hemos llegado por hoy, creo que en este capítulo hay suficiente información para pasar unos cuantos buenos ratos experimentando con el ARexx. Que lo disfruten y reciban un cordial saludo. |
| Envía esta página web a un amigo: Esta opción está desactivada temporalmente, rogamos disculpen las molestias |
|