lunes, julio 13, 2009

Macros de TNT: Variables (1)


En el post anterior olvide algo muy importante. Se trata de los comentarios.

El lenguaje de macros de TNT permite el uso de comentarios en la misma forma que el tradicional C, es decir entre un /* y un */. Los comentarios no tienen ningún efecto sobre el script, pero son muy útiles para documentar el código.

/* Este es un comentario */

Es muy importante colocar comentarios, no solo para que otras personas puedan entender el código, sino para que uno mismo pueda entenderlo más rápidamente cuando vuelve a el (en especial, si fue escrito hace tiempo!).

Los comentarios son validos, una vez se a iniciado el modo de macros (usando macro=)

Por tradición, coloco este macro simple

macro =;
/* Mi primer macro de TNT */

quote Hola mundo!;
p/;

Ahora entrando en materia con el tema de este post...


Las variables son los objetos que el programa manipula con un propósito especificado por el usuario. Las variables guardan valores, y estos valores pueden ser modificados o leídos. Muchas veces, es el valor contenido en una variable lo que nos interesa. En otras ocasiones, el contenido de una variable sirve para controlar el flujo del programa. También pueden usarse variables para guardar valores dados por el usuario.

Al arrancar un macro, TNT define por omisión un número de variables (1000). Estas se pueden acceder usando un número, que inicia desde 0. Es posible cambiar el numero de variables usando macro* N K; donde N es el número de loops, y K el número de variables.

Variables generales

Usar los números de las variables puede ser cómodo en ,macros pequeños, pero al incrementar la complejidad de los macros, se hace más difícil el mantenimiento del código, por lo que es una buena práctica usar nombres para las variables. Las variables se pueden nombrar en cualquier parte del programa. Pero es una buena práctica nombrarlas justo después de iniciar el archivo con el macro (después del macro=). Para su declaración se utiliza la palabra clave var.

Hay dos formas de nombrar las variables, una es una forma explicita, que sirve, más que todo, para mantener la compatibilidad con macros anteriores.

var =
0 variable1
1 variable2
5 variable3
;

En este formato, usando var= se tiene que nombrar cada variable con el número interno (de TNT) que la identifica. La declaración termina con un punto y coma. El principal problema con esta forma, es que invita al uso intercambiable de números y nombres en las variables. Eso puede tener un efecto nosivo a la hora de hacer mantenimiento al código (por ejemplo, querer agregar más variables).

Una forma mucho más cómoda, y más recomendable (evita el uso de variables sin nombre), es declarar directamente los nombres, usando dos punto (:) en vez de igual

var:
variable 1
variable 2
variable 3
;

De aquí en adelante, utilizo esta forma, que me parece, mejora la legibilidad del código escrito.

Las variables en TNT pueden ser simples, es decir, que contienen un solo valor, o pueden ser arreglos, series de valores consecutivos. Los arreglos de TNT son estáticos, es decir que no pueden redimensionarse en tiempo de ejecución. Por eso es bueno declararlos solo cuando ya sabemos el tamaño que puede tener. Por ejemplo, luego de leer los datos, ya sabemos cuantos nodos puede tener un árbol.

Declarar un arreglo es muy simple, es como una variable normal, pero con las dimensiones entre corchetes ([]), si es una matriz multidimensional, los valores se separan con comas (,) de forma similar a como se declaran los arreglos en pascal.

var:
arreglo [25]
matriz [3, 4]
;


Variables en ciclos

En TNT las variables de los ciclos son independientes de las variables generales. Estas variables son manejadas por TNT y no directamente por el usuario. Al igual que las variables tradicionales, pueden nombrarse, o usar los números que vienen por omisión que comienzan desde 1, y se incrementan al irse anidando los ciclos.

Yo en general utilizo los números. Quizá sea una mejor práctica utilizar nombres puesto que de esa manera se independiza de el anidamiento del ciclo, y además, es la única forma de acceder variables de ciclos desde otro archivo.

La forma de declarar una variable en un ciclo es anteponiendo un igual (=) antes del nombre:

loop =ciclo 1 10


Variables de linea de comando

Al llamar a un macro, es posible asignarle valores iniciales usando la línea de comandos asociada al llamado del macro. Estas variables se conocen como "argumentos" o "parámetros". Por ejemplo, uno podría tener un macro que se llame dojac, y que reciba como parámetros el número de replicas, y un número de iteraciones en cada replica, así

dojac 1000 20 ;

En este caso, se reciben 1000 replicas y cada replica tiene 20 iteraciones.

En general, cuando uno distribuye un macro, si no se da ningún parámetro, se ofrece una especie de salida de ayuda, donde explica el objetivo y las condiciones necesarias para utilizar el macro de forma correcta.

La función argnumber retorna el número de argumentos usados al invocar el macro.

No se olviden de revisar las novedades de TNT, y por supuesto, consultar la wiki de TNT ;), hay varios scripts y otra documentación muy útil :D