|
Por Mark L. Van Name y Bill Catchings
En las primeras dos partes de esta serie, se ha mostrado cómo introducir y ejecutar macros, así como la forma de introducir los diferentes parámetros para su correcto funcionamiento. En la parte final, se mostrarán las sentencias especiales, para hacer los macros potentes. Con dichas instrucciones, se conseguirá un mayor control sobre las ordenes, así como sobre los estamentos.
Normalmente los macros ejecutan sus instrucciones de una forma secuencial, es decir una detrás de otra. Esto demuestra que, en ciertas ocasiones, se necesita una mayor flexibilidad en el control de las sentencias. Por ejemplo usted podría ejecutar diferentes sentencias dependiendo de los valores introducidos. Tres comandos especiales del CLI, -IF, SKIP y LAB- son los que cumplen estas funciones.
Tomando decisiones
Si se testea una condición, y esa condición es cierta, se ejecutarán ciertos estamentos. Si por el contrario la condición no es cierta, el macro pasará a ejecutar otra parte del estamento.
Considere nuestro macro BACKUP, aparecido en el anterior artículo.
.KEY fichero,disco,nuevo-nombre
COPY <fichero><disco>:<nuevo-nombre>
BACKUP, funciona siempre y cuando se definan los parámetros <fichero> y <disco>. Si dichos parámetros, no obtienen los valores respectivos, se recibirá un mensaje de error sobre la sentencia COPY. Usando la sentencia IF, se asegurará que no se proceda a la ejecución del comando COPY, mientras el argumento <fichero> no se encuentre definido.
.KEY fichero,disco,nuevo-nombre
IF "<fichero> EQ ""
ECHO "Introduzca el nombre del fichero fuente"
SKIP DONE
ENDIF
COPY <fichero><disco>:<nuevo-nombre>
LAB done
Revisaremos este macro, línea por línea; comenzando por la sentencia IF. Dicha sentencia (IF), comprobará si el argumento <fichero> es igual (EQ) a una cadena nula (""), o lo que es lo mismo, ausencia de datos para dicho argumento. Hasta que dicho valor, no sea debidamente cumplimentado, el bucle se repetirá una y otra vez; mostrando por pantalla el correspondiente mensaje (línea ECHO), indicando que se proceda a la introducción del dato para <fichero>.
|
Los comandos IF, SKIP y LAB |
 |
ofrecen un mejor control |
 |
sobre la macro. |
 |
|
Si el parámetro ha recibido un dato cualquiera, siempre que no sea cadena nula, éste se tomará como dato para el argumento <fichero>; con lo cual se procederá a la ejecución de la instrucción siguiente al comando ENDIF (en este caso la sentencia COPY).
Control del programa
A continuación, los otros dos comandos especiales del CLI, mencionados anteriormente, serán de gran ayuda a la hora de crear macros con una mayor estructura. SKIP, permite saltar hacia la línea etiquetada mediante la instrucción LAB. En nuestro ejemplo anterior, se ha usado el comando SKIP para saltar hacia la línea posterior del comando COPY; esto sucederá cuando no se vean cumplimentados correctamente los datos. Para usar el comando SKIP, simplemente deberá seguir a la instrucción el nombre de una etiqueta.
SKIP label
Cuando se ejecuta la instrucción SKIP, se buscará, línea por línea, la forma:
LAB label
Si existen varias líneas etiquetadas con el mismo nombre, SKIP mandará el control de ejecución hacia la primera de ellas.
Si usted lo desea, podrá prescindir del argumento en la instrucción SKIP. Cuando esta sentencia sin etiqueta se ejecute, el control de programa será recibido por la primera línea LAB encontrada sin etiquetar.
En el Amiga 1.3, la opción BACK permite el control de programas hacia detrás; siendo su sintaxis la siguiente:
SKIP label BACK
O bien sin el nombre de etiqueta:
SKIP BACK
Esta versión de la sentencia SKIP, vuelve hacia la primera línea de programa; buscando a partir de ella la primera instrucción LAB con la etiqueta correspondiente (o sin etiqueta, siempre y cuando SKIP no la contenta).
Sin embargo, existe una importante restricción en la opción BACK: ésta solamente bifurcará hacia detrás, como muy lejos, hasta el último comando EXECUTE. Si su macro contiene varios comandos EXECUTE previos, SKIP retomará hacia el más cercano; comenzando a buscar hacia delante desde este punto.
En cualquier caso, esté seguro de que SKIP encontrará la etiqueta que le haya indicado. Si SKIP llegase al final de la macro sin encontrar la etiqueta, usted recibirá el mensaje de error:
LABEL <etiqueta> not found by SKIP
Finalizando la ejecución del macro.
Opciones de comparación
Volviendo al comando IF, decir que éste contempla más funciones que las de comparar un argumento con una cadena nula. De hecho, IF permite comparar un argumento con una cadena. Por tanto, en nuestro ejemplo, puede comparar el argumento con el fichero específico "FRED": para ello use la siguiente sintaxis:
IF "<fichero>" EQ "FRED"
O su equivalente
IF "<fichero>" EQ FRED
Otra opción, del comando IF, es el comando ELSE, el cual permite la bifurcación del programa saltando partes innecesarias de éste cuando la comparación es falsa. IF, ELSe y ENDIF, trabajan juntos en el siguiente formato:
IF condición
comando-set1
ELSE
comando-set2
ENDIF
Si la condición es cierta, el macro ejecutará el comando(s) situados en comando-set1, saltando al primer comando situado después de ENDIF. Si la condición resulta ser falta, el macro saltará inmediatamente a continuación de la línea ELSE; ejecutando por tanto la sentencia(s) incluida en comando-set2.
Para observar estas tres nuevas opciones en acción, considere la siguiente versión de nuestro macro BACKUP:
.KEY fichero,disco,nuevo-nombre
IF "<fichero>" EQ "modo de uso"
ECHO "Para usar este macro, usted deberá insertar los siguientes datos".
ECHO "1) Nombre de fichero fuente"
ECHO "2) Disco destino"
ECHO "3) Nuevo nombre para el fichero objeto"
ELSE
COPY <fichero><disco>:<nuevo-nombre>
ENDIF
En esta versión, primeramente se chequeará si se ha introducido "modo de uso" como dato para el argumento del fichero. Si usted lo introduce, el macro mostrará unas someras instrucciones sobre el uso de este macro; saltando posteriormente a la instrucción de datos. Por el contrario si la cadena introducida es otra cualquiera, se saltará directamente a la ejecución del comando COPY.
De otro modo usted podrá incluir asimismo comandos IF, dentro de otros. Cuando usted lo haga, cada IF terminará su ejecución con el primer comando ENDIF siguiente.
De igual modo, existen otras opciones de comparación. Estas son GT (mayor que) y GE (mayor o igual). Use NOT delante de la condición elegida para la negación de ésta; por ejemplo:
IF NOT "<parm"> EQ "cadena"
De igual forma utilice NOT y GE juntos para el "menor que", mientras que el NOT y GT se corresponden a la forma "menor o igual que".
|