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.