Tcl (pronunciado /tí.quel/, originado del acrónimo eninglés "ToolCommandLanguage" o "lenguaje de herramientas de comando", actualmente se escribe como "Tcl" en lugar de "TCL"), es un lenguaje descript creado porJohn Ousterhout, que ha sido concebido con unasintaxis sencilla para facilitarse su aprendizaje, sin detrimento de la funcionalidad y expresividad.
Se utiliza principalmente para el desarrollo rápido de prototipos, aplicaciones "script",interfaces gráficas y pruebas. La combinación de Tcl conTk (del inglésToolKit) es conocida comoTcl/Tk, y se utiliza para la creación de interfaces gráficas.
Tcl es unlenguaje interpretado, y su código puede ser creado y modificado dinámicamente. Susreglas sintácticas son extremadamente simples y posee reglas de alcance dinámico. Permite escribir código fácil de mantener. Losscripts Tcl son a menudo más compactos y legibles que los programas funcionalmente equivalentes en otroslenguajes de programación. Es un lenguaje multiplataforma, conintérpretes que se ejecutan sobreWindows,Linux,UNIX,MacOS yOSX e incluso microprocesadores PIC.
Todos los elementos de un programa son comandos, incluyendo las estructuras del lenguaje. Dichos comandos se escriben ennotación polaca y pueden ser redefinidos o sobreescritos de manera dinámica.
Una característica notable es que los datos son manejados comocadenas de caracteresUnicode, incluyendo elcódigo fuente, soportandoUnicode desde el lanzamiento de la versión 8.1, en el año 1999.
Una de las características más usadas de Tcl es su extensibilidad. Por ejemplo, si una aplicación requiere algo de funcionalidad no ofrecida por el Tcl estándar, los nuevos comandos de Tcl pueden ser implementados usando el lenguajeC, un integrado sumamente fácil. Tcl es "extensible" a través deC,C++ yJava. En versiones recientes permite la programación orientada a objetos, en las primeras versiones requería de una extensión para tal fin. Puede extenderse también aentornos gráficos, a través de una interfaz denominadaTk.
El lenguaje Tcl fue originalmente proyectado para ser unlenguaje de comando reutilizable. Quienes desarrollaron Tcl estaban creando una serie de herramientas interactivas, y cada una constaba de su propio lenguaje de comando. Desde que comenzaron a interesarse más en estas herramientas que en los lenguajes de comandos que utilizarían, estos lenguajes comenzaron a construirse rápidamente sin considerar el diseño apropiado, sin mucha importancia.
Después de implementar varios lenguajes de comandos creados de esta forma y experimentar problemas con cada uno de ellos, decidieron concentrar su atención en la implementación de un objetivo general: un lenguaje de comando eficaz que pudiera ser integrado fácilmente en nuevas aplicaciones. Es de esta manera que nace el lenguaje Tcl (del inglésTool Command Language), cuyas siglas en español significan "Lenguaje de Herramientas de Comando".
Desde ese entonces, el lenguaje Tcl ha sido utilizado como lenguaje de código. En muchos casos, Tcl es usado en combinación con labibliotecaTk (deTool Kit, en español, caja de herramientas), un conjunto de comandos y procedimientos que hacen relativamente fácil para programarinterfaces de usuario gráficas.
Desde que Tcl comenzó a ser un lenguaje fácilmente extensible, se han escrito muchas extensiones para ciertas tareas específicas, y están generalmente disponibles libremente en Internet.
Un script Tcl consiste de varias invocaciones de comandos. Una invocación de un comando es una lista de palabras separadas por un espacio y terminada en un carácter de nueva línea o un punto y coma.
palabra0 palabra1 palabra2 ... palabraN
La primera palabra es el nombre de un comando, el cual no está dentro del lenguaje, sino en unabiblioteca. Las siguientes palabras son los argumentos. Así se tiene:
Un ejemplo práctico, usando el comandoputs el cual envía una cadena de caracteres a una salida (añadiendo una nueva línea al final) en forma predeterminada sobre el canalstdout:
puts"Hola, mundo!"
Las variables y los resultados de otros comandos pueden introducirse también dentro de las cadenas de caracteres, tal como en este ejemplo donde usamosset (comando de asignación de variables) yexpr (comando de expresiones aritméticas) para almacenar el resultado de un cálculo en una variable, yputs para imprimir el resultado junto con un texto explicativo:
setsuma[expr{1+2+3+4+5}];#asigna a la variable suma el resultado de la evaluación de la expresión aritmética 1+2+3+4+5puts"La suma de los números 1..5 es $suma.";#muestra una cadena de caracteres con el resultado almacenado en la variable suma
El punto y coma; sirve para poner dos o más comandos en una misma línea, o para agregar un comentario después de un comando (un comentario se empieza con el símbolo#):
#Comentario en una línea sin comandosputs"¡Hola Mundo!";puts"otra linea de caracteres"seti0;#Comentario, con un ';' para separarlo del comando
Con"" (bloques entre dobles comillas) se representan cadenas con el agregado de que se puede intercalar el valor de variables (sustituye el contenido de la variable) utilizando el símbolo $ seguido del nombre de la variable.
Con{} (bloques entre llaves) pueden contener cadenas, pero no se pueden intercalar variables como en el caso de las doble comillas, por ejemplo, en una consola tcl (invocandotclsh en un terminal):
%setnumero545;#Asignación a la variable numero con 545545%puts"El valor es $numero";# Con dobles comillas podemos poner el contenido de la variable numeroElvalores545%puts{Elvalores$numero};# Pero entre llaves muestra el símbolo $ seguido del nombre de la variableElvalores$numero
Los bloques entre llaves sirven además para las estructuras de control, ya que son tratadas como cualquier otro comando.
Los() (paréntesis) sirven para encerrar los índices en las tablas asociativas, o para agrupar en expresiones aritméticas.
Con[] (bloques entre corchetes) se realiza la sustitución del contenido de un resultado, por ejemplo, en una consola tcl:
%puts[expr{1+[setu342]}];# Muestra el resultado de la expresión de sumarle 1 a la variable u que se le asigna antes 342343%puts$u;# Muestra el contenido de u342
Las variables no tienen tipos explícitamente. Sin embargo podemos definir seis tipos
Booleanas : 0/no/off (en caso de ser falso) y 1/yes/on/ (en caso de ser verdadero) o un número diferente de 0
Números : 1 0 3.14 1.e-10, se tratan como cadenas, salvo en expresiones aritméticas en que se convierte primero en binario.
Cadenas de caracteres : Bienvenido, "Madame De Labas", 32 , {z 3.14}
Listas : de booleanas, nombres, cadenas o listas (pudiendo anidar listas)
Diccionarios : Son pares clave-valor, similares a las tablas asociativas. Pueden contener cualquier tipo de dato en el valor. Este tipo de variables se incluye desde Tcl 8.5 en adelante.
Tablas asociativas : T(clave) M(2,3) que puedan contener los 5 tipos anteriores, incluso mezclados.
Las cinco primeros tipos son llamados tipos escalares, así que pueden ser pasados por valor y regresar al llamar a un procedimiento. Los tipos de escalar se convierten automáticamente en el tipo adecuado, por ejemplo, una cadena puede ser una lista como se ve a continuación utilizando una consola tcl:
Una función puede devolver una cadena o una lista, pero no una tabla asociativa ya que no es una variable escalar. Estos pueden ser pasados por referencia. Los diccionarios se pueden utilizar como un parámetro de un procedimiento, e incluso puede ser devuelto.
Contrariamente a lo que ocurre con otros lenguajes de programación, las palabras que se utilizan para las estructuras de control en Tcl no son palabras reservadas con una sintaxis especial. "for", "if", "while" son procedimientos que siguen la sintaxis habitual Tcl.
while{unaExpresionLogica}{unCommandounCommando....}if{$x<0}{setx0}elseif{$x<5}{setx5}else{setx10}for{seti0}{$i<10}{incri}{puts$i}foreachi[list"youpii""aujourd'hui""il fait beau""bravo !""bravo !"]{puts$i}# no es necesario usar el comando list con valores fijos; esto es equivalenteforeachi{"youpii""aujourd'hui""il fait beau""bravo !""bravo !"}{puts$i}foreacha$listaAb$listaBc$listaC{puts"$a $b $c"}foreach{xy}[listSrGastonSraJeanneSrRobertSraRaymonde]{puts"$x $y"}setcolorazulswitch$color{rojo{puts"FF0000"}azul{puts"0000FF"}verde{puts"00FF00"}blanco{puts"FFFFFF"}negro{puts"000000"}default{puts"desconocido"}}
Eclipse corriendo un programa Tcl que utiliza la extensiónincr Tcl para la programación orientada a objetos.
EnLinux y otras plataformas de derivados deUnix, el intérprete Tcl/Tk a menudo se instala de manera predeterminada. Si este no es el caso, normalmente es necesario instalar los paquetes correspondientes a la distribución o sino utilizar el código fuente de Tcl y compilarlo para luego proceder con su instalación. Por otra parte, la ejecución de un código Tcl se realiza escribiendo en el intérprete de comandos o consola:
$tclsharchivo.tcl
También se puede obtener una consola Tcl escribiendo en ella solamentetclsh. Existen otras consolas para Tcl, como TkCon, que es un intérprete mejorado escrito por Jeff Hobbs.[5] La programación de Tcl/Tk es soportada por gran variedad deIDEs, tal comoEclipse a través del proyectoDLTK (Dynamic Languages Toolkit), que contiene plugins para compiladores de lenguajes dinámicos Tcl,Ruby,Javascript yPython.[6]
Tcl dispone nativamente de la programación orientada a objetos desde la versión 8.6 (20 de diciembre de 2012). La sintaxis es la siguiente:
objeto método arg1 arg2 ....
Ejemplo:
oo::classcreateDistribuidorTicket{variablecontadorconstructor{}{setcontador0}methodentregaTicket{{ticket1}}{incrcontadorfor{seti0}{$i<$ticket}{incri}{puts"Entrega del ticket n° $i para el control $contador"}}}setmacommande[DistribuidorTicketnew]$macommandeentregaTicket2
Tcl no contaba en sus orígenes con construcciones específicas en su sintaxis para soportar el paradigma de laprogramación orientada a objetos (POO). La inclusión de la POO en Tcl fue un tema de discusión recurrente dentro de la comunidad de usuarios de este lenguaje. Las opiniones estaban divididas porque la POO no es el único paradigma adaptable, por el deseo de conservar compacto a TCL y por la gran variedad de adaptaciones posibles a los conceptos de objetos. Por esta razón existen varias extensiones diferentes que implementan la POO.
Pese a esto, desde la versión 8.6 cuenta nativamente en su núcleo con un sistema básico de orientación a objetos basado enXOTcl,[7] buscando unificar a las demás extensiones.
Utiliza el paradigma de objetos puro, a diferencia de otras extensiones, no se basa en la herencia de objetos, sino que trabaja con herencia a vínculos elegidos. Un objeto trabaja con delegaciones.