2009-06-21 14 views
13

He estado trabajando con TCL/TK, recientemente comencé a usar TCL/TK con mis aplicaciones de automatización y estoy ansioso por saber.Características ocultas de TCL/TK

Para continuar con la larga lista de preguntas característica oculta, me gustaría saber alguna características ocultas o útiles de TCL/TK o cualquier método fácil de conseguir algunas grandes operaciones

+3

wiki de la comunidad por favor. –

+1

En segundo lugar esa solicitud. – Geo

+0

Lo siento todos ... Tengo que aceptar cualquiera de las respuestas para stack over fow. Aquí todo es una buena respuesta solo ... Simplemente acepto la respuesta como basada en votos al alza – joe

Respuesta

14

Cuando un tipo de marketing en Sun declaró que TCL estaba "listo para la empresa", los desarrolladores añaden la siguiente característica:

$ tclsh 
% clock format [clock seconds] -format %Q 
Stardate 63473.2 
+0

Gran característica, aunque parece que les da vergüenza: http://www.tcl.tk/man/tcl8.5/TclCmd/clock.htm#M58 "% Q Este grupo de formato está reservado para uso interno dentro del Tcl biblioteca." – phihag

+19

El formato de hora de fecha estelar no tiene nada que ver con Sun. Lo agregué a Tcl mientras trabajaba en Scriptics, como un huevo de pascua para la próxima Conferencia Tcl2K. Uno de los eventos de la conferencia fue una competencia para implementar una utilidad de conversión de estándar a estrella, usando una fórmula arcana. Solo un hombre entró al evento. Pasó un par de horas angustiado por la implementación (ya que estaba buscando un trabajo en Scriptics, estaba ansioso por impresionar) solo para que el huevo de Pascua se revelara después. Por supuesto que ganó la competencia de todos modos. Y él consiguió el trabajo, también. –

+4

Aquí está el registro de CVS para la adición: http://tcl.cvs.sourceforge.net/viewvc/tcl/tcl/unix/tclUnixTime.c?view=log#rev1.7 El bit de "Enterprise" fue una jugada en el tema de Tcl2K, que era que Tcl era el único lenguaje de scripting amigable para la empresa. La página de manual es deliberadamente vaga porque, por supuesto, es un huevo de Pascua. –

6

Una característica muy útil que no está escondido, pero tiende a no ser evidente para las personas procedentes de otros idiomas es que se puede definir sus propias estructuras de control (o incluso redefinir los existentes si quieres vivir peligrosamente). Hay ejemplos en el Tcl Wiki

14

Mi función favorita "oculta o útil" es cómo funciona la cita en Tcl. Me gusta usar la frase "citando es una herramienta, no una regla". También me gusta decir "sólo necesita las llaves cuando se necesita llaves"

Mientras que la mayoría de los idiomas tienen reglas para los que delimitadores de bloque deben ser utilizados para ciertas cosas (por ejemplo, en C debe utilizar {} para designar un bloque), Tcl no es tan estricto.

Con Tcl, puede elegir los caracteres de cotización que le den el efecto que necesita. Sin duda hay mejores prácticas, pero al final puedes elegir el personaje de cita que mejor te permita hacer el trabajo.

Eso significa, por ejemplo, se puede definir un procedimiento de muchas maneras, incluyendo:

proc foo {args} { 
    .... body here .... 
} 

proc foo "args" " 
    .... body here .... 
" 

proc foo args [some code that returns the body] 

... y así sucesivamente. Lo mismo aplica para sentencias condicionales, bucles y todo lo demás. (para los no iniciados, las llaves son más o menos equivalentes a la comilla simple de la concha, las comillas dobles son como la comilla doble de la concha, y los corchetes son como la contraparte de la concha).

Ahora, mucha gente mira eso y dice WTF? pero realmente le da mucho poder al programador. A menudo recibimos preguntas en comp.lang.tcl en la línea de "si hago esto {y $ eso} ', ¿cómo puedo obtener $ para ampliar?". La respuesta sigue al viejo chiste "paciente: doctor, duele cuando hago este doctor: no hagas eso". Es decir, si no te gusta el comportamiento que obtienes con un conjunto de delimitadores, elige algún otro delimitador. El hecho de que una instrucción if se construya normalmente con llaves no significa que debe construirse con llaves.

Esa es mi función "oculta" favorita de Tcl. No está oculto, está justo en la página del manual de Tcl (n) maravillosamente completa pero concisa, pero las ramificaciones no son claras hasta que comprendes completamente cómo funciona Tcl.

+0

Un obstáculo definitivo para principiantes, especialmente con formas como 'expr' (o eso he descubierto mientras lo estoy aprendiendo). – new123456

11

Otra característica no obvia es que los comandos no reconocidos se corresponden con un controlador llamado "desconocido" que puede redefinir. P.ej. que han comandos desconocidos tratada como expresiones para evaluar:

$ tclsh 
% 2+2 
invalid command name "2+2" 
% proc unknown args {uplevel 1 [linsert $args 0 expr]} 
% 2+2 
4 

Más ejemplos se pueden encontrar en la página wiki en Radical Language Modification

+0

¡Genial! Esto sería mejor si se verificara si el nombre del comando es un "2 + 2" válido. ;-) –

5

mi humilde opinión, la mayor característica oculta de Tcl es su C API. uso de este, que es muy fácil para envolver un programa o subsistema C central y escribir una GUI u otra funcionalidad en Tcl.Si bien esta característica no es exclusiva de Tcl, Tcl fue diseñada para hacer esto desde cero y es particularmente fácil trabajar con la API C.

La segunda característica oculta más grande es packer, el abuelo de todos los gerentes de geometría. Con esto, una GUI puede tener ventanas importantes con una cantidad sorprendentemente pequeña de código. Es importante tener en cuenta que Tcl/Tk tenía una administración de geometría al menos 10 años antes de que apareciera .net.

La tercera característica más importante de Tcl es la capacidad de ejecutar el lenguaje, ya sea a través de la API C o con comandos definidos en Tcl. No del todo las macros LISP, pero bastante flexibles, no obstante. Expect es un muy buen ejemplo de una aplicación basada en la extensión del lenguaje basse Tcl para crear un lenguaje de scripting específico del dominio.

EDIT: bueno, yo carretera y manta, Xt really did have a geometry manager, aunque estoy de acuerdo con Nat en que se trata de algo más doloroso que el paquete; -}

+5

Es sorprendente que entre el paquete y los gerentes de geometría de cuadrícula, más del 99% de todos los problemas de diseño se puedan resolver, y con muy pocas líneas de código. Contraste esto a un conjunto de herramientas como wxWidgets que requiere al menos cuatro gerentes de geometría para hacer el mismo trabajo: GridSizer, FlexGridSizer, BoxSizer y StaticBoxSizer. Además, los clasificadores de cajas no son tan potentes como el empacador, por lo que normalmente debe usar uno para el diseño horizontal y otro para vertical, algo que el empaquetador maneja con aplomo. –

+0

@Bryan Oakley - abso-f-ing-lutely. Escucha Escucha. No podría haberlo puesto mejor yo mismo. – ConcernedOfTunbridgeWells

+0

Xt tenía administradores de geometría antes de Tk, pero Xt era una API horrible para trabajar. Tk fue un soplo de aire fresco después de haber experimentado los conjuntos de artilugios Athena y Motif. – Nat

7

Tcl es un lenguaje tan simple, abierta hay muy pocas características ocultas . Todo está expuesto para que el programador se extienda y se adapte.

+0

Haces un buen punto. –

+1

TCL podría ser un lenguaje simple sin demasiados comandos, pero se pueden combinar de maneras interesantes. –

6

Todas las "palabras clave" de Tcl son comandos Tcl regulares, incluyendo estructuras de control como [para], [foreach], [mientras], etc. Esto significa que puede extender el lenguaje escribiendo nuevas estructuras de control en código Tcl puro .

Por ejemplo, la estructura try/on/trap se ha implementado en Tcl 8.6a utilizando solo el código Tcl. De manera similar, tcllib contiene control :: do, una estructura de control do/while.

Mucho de esto es posible a través de los comandos [upvar] y [uplevel], que le permiten acceder a variables o ejecutar código en un marco de pila diferente.

10

El comando [trace] de Tcl le permite interceptar lecturas y escrituras en cualquier variable. Esto le permite implementar un observador en cualquier variable y agregar una verificación automática de rango de complejidad arbitraria a cualquier variable (como si estuviera accediendo a la variable a través de un setter/getter). También puede crear variables autoincrementables usando esta técnica.

proc varlimit_re {re var key op} { 
    upvar $var v 
    if { [regexp -- $re $v] <= 0 } { 
    error "$var out of range" 
    } 
} 

trace add variable ::myvar {write} [list varlimit_re {^[A-H]\d{3}-[0-9a-f]+$}]` 

Si se intenta establecer 'mivar' a cualquier cosa que no coincide con la expresión regular, obtendrá un error de ejecución.

2

La bien documentada API C también permitió una fácil integración en Perl. Mi experiencia con Tcl/Tk se remonta a 1995, pero en 2000 más o menos, descubrí Perl/Tk y nunca miré hacia atrás.

Y, últimamente, los paquetes Tcl y Tkx Perl nos dan GUI de aspecto moderno. Y los dos módulos antes mencionados, aunque no son triviales, implican relativamente poco código, considerando lo que permiten que uno haga a través de los límites del idioma. Y eso puede ser directamente atribuible a la excelente API (y el poder de Perl, obviamente).

5
  1. [array names] es una de las primeras preguntas novatos preguntan sobre cómo iterar sobre una matriz
  2. también, el hecho de que pueda foreach {key1 key2} {$list1 $list2} {...} - incluso si las listas son de diferente tamaño
  3. no debe utilizar los comentarios entre los casos de conmutación (esto no es una función interesante, pero un problema la mayoría de los desarrolladores no entienden
  4. el comando rename puede cambiar el nombre de cualquier función/proc
+1

Este último es parte de lo que le da tanta flexibilidad al programador Tcl. ¿Cuántos otros idiomas te permiten redefinir "si" o "regresar"? Y aunque muy rara vez hay un momento en el que necesite cambiar el nombre de los comandos básicos, la única vez que lo haga estará muy contento de poder hacerlo. –

5

Creo que el comando time es maravilloso. No está exactamente oculto, pero eso no impide que las personas pregunten "qué función es más rápida" de vez en cuando en comp.lang.tcl.

Cada vez que quiera saber "¿cuánto tiempo lleva esto?" o "¿qué método es más rápido?" solo lo llamas a través del comando "tiempo". Sin creación de objetos, sin matemática, sin gastos generales, excepcionalmente simple. Otros idiomas tienen una característica similar, aunque algunos son un poco menos elegantes.