Etiquetas Simbólicas
Una interesante mejora incorporada en BBj es la inclusión de las "symbolic labels" o etiquetas simbólicas para trabajar nuestros programas favoreciendo la escritura de código sin número de línea. En la presente ayuda indicamos algunas interesantes formas de utilizar esta nueva facilidad.
Normalmente nuestros programas hacen referencias a números de línea que no siempre son conocidas previamente o que pueden variar según nuestro programa va recibiendo modificaciones. Un ejemplo nos puede servir para ilustrar el problema y ver las soluciones:
Mira este código:
0010 BEGIN
0020 OPEN (1)"DATOS.bbj"
0030 READ (1,KEY=$$,DOM=0040)
0040 READ (1,END=0070)A$,B$
0050 PRINT A$," ",B$
0060 GOTO 40
0070 PRINT "FIN DE LECTURA"
0080 STOP
Este sencillo código contiene varias referencias de línea hacia donde el programa transfiere el control cuando se produce alguna de las condiciones controladas (llave inexistente o duplicada, fin de archivo, etc.) Pero, ¿que pasa cuando este mismo programa queremos hacerlo sin usar números de línea?
Veamos nuestro programa sin número de líneas ahora (los signos de interrogación señalan las líneas que falta referenciar):
BEGIN
OPEN (1)"DATOS.bbj"
READ (1,KEY=$$,DOM=????)
READ (1,END=????)A$,B$
PRINT A$," ",B$
GOTO ????
PRINT "FIN DE LECTURA"
STOP
Este tiene una solución artesanal, pero que implica modificar nuestro código incluyendo etiquetas de línea. Nuestro programa quedaría así:
BEGIN
OPEN (1)"DATOS.bbj"
READ (1,KEY=$$,DOM=LECTURA)
LECTURA:
READ (1,END=FIN_LECTURA)A$,B$
PRINT A$," ",B$
GOTO LECTURA
FIN_LECTURA:
PRINT "FIN DE LECTURA"
STOP
Problema solucionado. Pero nuestro código se empieza a llenar de etiquetas que no hacen más que maquillar nuestra estructura de programación originaria de BBx. Aquí es cuando las etiquetas simbólicas comienzan a simplificarnos el código en BBj.
Vea esta versión modificada de nuestro programa:
BEGIN
OPEN (1)"DATOS.bbj"
READ (1,KEY=$$,DOM=*next)
LECTURA:
READ (1,END=FIN_LECTURA)A$,B$
PRINT A$," ",B$
GOTO LECTURA
FIN_LECTURA:
PRINT "FIN DE LECTURA"
STOP
He destacado a propósito la palabra "*next" que es el primer caso de uso de una etiqueta simbólica en nuestro código. Esta etiqueta le está indicando a nuestra instrucción que en caso de encontrar un !ERROR=11 (llave duplicada o inexistente) el control del programa lo transfiera a la siguiente línea de código (en nuestro ejemplo a la etiqueta LECTURA: que hemos mantenido debido a la necesidad de la instrucción GOTO que aparece más abajo de volver a la siguiente lectura de nuestro archivo).
¡Y las posibilidades se multiplican! Si quisiéramos que nuestro código interrumpiera la ejecución del programa ante la ocurrencia de DOM=, podríamos usar la etiqueta "DOM=*escape"; si queremos detener la ejecución del código: "DOM=*stop". Más interesante aún, si estuviéramos ejecutando una instrucción dentro de una subrutina invocada con GOSUB o mediante un CALLBACK registrado en nuestro programa, tendríamos la posibilidad de incluir una instrucción RETURN dentro de la bifurcación: "DOM=*return") evitando la necesidad de derivar nuestro código a la línea dentro del programa que contiene el RETURN normal de una subrutina (más necesario aún en programas sin número de líneas , en donde la ubicación del RETURN es imposible de ubicar).
Pero volvamos a nuestro programa ejemplo y veamos una interesante manera de abordar la lectura secuencial de un archivo, cambiando la estructura de lectura y aprovechando algunas otras etiquetas simbólicas disponibles en BBj. Examina con detenimiento este código y nota la mejora estructural que consigues usando una estructura de ciclo WHILE..WEND:
begin
open (1)"DATOS.bbj"
read (1,key=$$,dom=*next)
while 1
read (1,end=*break)a$,b$
print a$," ",b$
wend
print "fin de lectura"
STOP
Usando las etiquetas simbólicas *next y *break en nuestro código hemos conseguido hacer una lectura secuencial completa, pero "olvidándonos" por completo de los números de línea. Esta estructura no los necesita, y logramos exactamente el mismo resultado que con nuestros antiguos programas. De hecho, la sangría aplicada a las instrucciones dentro del ciclo WHILE..WEND se puede incluir en nuestros programas y BBj las recordará cada vez que carguemos nuestros programas, pues no guarda una versión "tokenizada" o compilada de nuestras instrucciones, sino la versión original de nuestro código.
La lista de etiquetas simbólicas se pueden usar en las cláusulas ERR=, END= y DOM=. A continuación una lista de etiquetas disponibles en BBj (con una pequeña descripción de funcionalidad):
Comienza desde ya a utilizar estas nuevas características en tu código y estarás dando un paso hacia la programación sin números de líneas en tus programas BBj.