Informatica Grafica
C A P I T U L O 9 Tcl avanzado

En este capítulo se hablará de una seríe de comandos no tan importantes como los anteriores, pero necesarios en ocasiones, y de difícil catalogación en alguno de los capítulos precedentes.


El comando clock

Este comando efectúa las operaciones que permiten obtener o manipular cadenas o valores que representan el tiempo. El argumento opcion determina cuál es la acción a efectuar por el comando. Las opciones permitidas son :

clock opcion arg1 arg2 ...?

Tabla 9-1. Opciones del comando clock.

clock clicks

Devuelve el tiempo en alta resolución.

clock format valor? -format string? -gmt bool

Convierte un valor en segundos, en tiempo legible.

clock scan datestring? -base valor -gmt bool

Convierte una fecha dada en un formato, en segundos.

clock seconds

Devuelve la fecha y hora actual en segundos.

En el argumento de format, se colocará el descriptor de cómo se desea que el tiempo y la fecha sean formateados. Estos descriptores de campo consisten en un % seguido de un carácter. Los valores válidos son:

Tabla 9-2. Descriptores de formato de fecha y hora. (más usuales).

%a

Día de la semana abreviado (Mon, Tue, ...).

%A

Día de la semana complet0 (Monday, Tuesday, ...).

%b

Mes abreviado (Jan, Feb, ...).

%B

Mes completo (January, February, ...).

%d

Día del mes (01-31).

%D

Fecha (%m/%d/%y).

%e

Día del mes (1-31) Sin ceros.

%H

Hora (00-23).

%I

Hora (00-12).

%m

Número del mes (01-12).

%M

Minuto (00-59).

%S

Segundos (00-59).

%T

Hora (%H:%M:%S).

%V

Número de la semana del año (01-52).

%w

Día de la semana ( Sunday = 0).

%Y

Año ccyy (Ej: 1997).

%Z

Nombre de la zona horaria.

Si el formato no es especificado, este será:

%a %b %d %H:%M:%S %Z %Y

No debe olvidarse que al ser Tcl un lenguaje procedente del entorno UNIX, cuenta el tiempo en segundos a partir del 1 de Enero de 1970.

Ejemplo 9-1.
% set t [clock seconds]
833589295
% set fecha [clock format $t -format "%a %d %b %Y"]
sat 01 Jun 1996
% set hora [clock format $t -format "%H:%M:%S"]
02:38:16

El siguiente ejemplo son dos procedimientos que permiten presentar la fecha y la hora en una ventana. Se actualiza de forma automática cada cierto tiempo, ya que se le pasa como parámetro el tiempo, en milisegundos, que debe esperar entre actualizaciones. El comando after hace que espere sin hacer nada durante este tiempo. Esto no interfiere en el funcionamiento del programa principal, que continúa funcionando normalmente.

Ejemplo 9-2.
proc ActualizarFecha { ms } {
global fechaSys
set fe1 [clock format [clock seconds] -format "%d %b %Y"]
if {$fe1 != $fechaSys} {
set fechaSys $fe1
}
after $ms ActualizarFecha $ms
}
proc ActualizarHora { ms } {
global horaSys
set fe2 [clock format [clock seconds] -format "%H:%M"]
if {$fe2 != $horaSys} {
set horaSys $fe2
}
after $ms ActualizarHora $ms
}
set horaSys ""
set fechaSys ""
ActualizarHora 1000
Actualizarfecha 1800000



El comando info

El comando info permite obtener información acerca del intérprete. Las operaciones más habituales con este comando son:

Tabla 9-3. El comando info.

info args procedimiento

Devuelve una lista de los argumentos de los procedimientos.

info body procedimiento

Devuelve los camandos en el cuerpo del procedimiento.

info commands ?patron?

Devuelve el número de comandos ejecutados.

info exists variable

Devuelve true si existe la variable.

info globals ?patron?

Devuelve una lista de variables globales.

info library

Devuelve el path del directorio de la librería de Tcl.

info tclversion

Devuelve el número de versión de Tcl.

info vars ?patron?

Devuelve una lista de las variables visibles.



El comando exec

El comando exec es usado para ejecutar otros programas desde una aplicación Tcl. La salida que el programa ejecutado efectuaría por la salida estándard puede ser capturada mediante el comando catch.

Ejemplo 9-3.
% exec wish42.exe c:/tcl/lib/entorno/entorno.tcl

En este ejemplo, se ha hecho correr desde el intérprete de tcl, el intérprete de Tk, wish80.exe, que a su vez ha intérpretado un programa denominado entorno.tcl.

Esta es una forma sencilla y cómoda de implementar nuevos comandos Tcl, sin recurrir al algo más engorroso método de crear un nuevo intérprete que incorpore el nuevo comando.

Así, por ejemplo, si lo que se desea es conseguir que Tcl incorpore una función que le prmita conseguir números aleatoros, cosa que hasta la versión 8.0b1 no podía hacer, bastará con escribir en C o en cualquier otro lenguaje de programación, una función que devuelva un número aleatorio. pero este valor no debe devolverlo como resultado del programa, sino que debe escribirlo en la salida estandard. Es decir, en C no debería de hacerse

return num;

sino:

printf("%f",num);

Este valor será el devuelto por exec y que puede ser captura mediante un catch de la siguiente forma:

catch { exec c:/usr/vergara/aleatorio.exe } num_aleat

Con lo que el valor devuelto quedará almacenado en la variable Tcl num_aleat.


Los comandos eval, list y uplevel

El comando eval permite la evaluación de un comando que ha sido creado durante la ejecución de un programa. Es decir, si durante la ejecución de un programa o aplicación se construye en una lista, por ejemplo, un comando de Tcl, este no funcionará directamente, ya que serán necesarias algunas sustituciones más, sino que deberá ejecutarse empleando el comando eval.

Ejemplo 9-4.
% set cmd{puts "esto es una prueba de Tcl"}
puts "esto es una prueba de Tcl"
# más tarde ...
% eval $cmd
esto es una prueba de Tcl

El ejemplo anterior, permite ejecutar un comando generado de forma dinámica durante la ejecución del programa. Pero pudiera ocurrir que la variable a la que hace referencia el comando, exista en el momento de generar dicho comando, pero no en el momento de ejecutarlo. En este caso se usará el comando list .

Ejemplo 9-5.
set cadena {puts "esto es una prueba de Tcl"}
set cmd $cadena
unset cadena
eval $cmd
canīt read "cadena": no such variable.

En este caso da un error, ya que cadena no existe en el momento de ejecutar el comando.

Ejemplo 9-6.
set cadena {puts "esto es una prueba de Tcl"}
set cmd [list puts $cadena]
unset cadena
eval $cmd
esto es una prueba de Tcl

En este otro caso no hay error, puesto que utilizando el comando list, ya se realiza la sustitución de la variable cadena por su contenido, por lo que es independiente de que se borre o no la variable a la que hace referencia.

El comando uplevel es similar a eval, con la diferencia de que uplevel evalúa un comando en un ámbito de variables distinto al propio. La sintaxis de uplevel es la siguiente:

uplevel level comando

Por ejemplo, si se desea evaluar un comando en el ambito global (valor 0) del programa:

uplevel #0 $cmd

Previous Page Next Page


© 1995-98, etsimo WWW team
Última modificación: 19 de Agosto de 1998 - 17:50:41