[go: nahoru, domu]

Ir al contenido

Diferencia entre revisiones de «Tcl»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Ira Leviton (discusión · contribs.)
m Corregí un error ortográfico
Conopo (discusión · contribs.)
actualizada a la última versión
 
(No se muestran 19 ediciones intermedias de 14 usuarios)
Línea 3: Línea 3:
|logo = Tcl.svg
|logo = Tcl.svg
|tamaño_logo = 70px
|tamaño_logo = 70px
|extensiones_comunes = .tcl, .tbc<ref>{{cita web |url=http://docs.activestate.com/tdk/4.1/Compiler.html |título= Tcl Dev Kit - Compiler |sitioweb=ActiveState Docs |fechaacceso=2016-11-02 |idioma=inglés}}</ref>
|extensiones_comunes = .tcl, .tbc<ref>{{cita web |url=http://docs.activestate.com/tdk/4.1/Compiler.html |título=Tcl Dev Kit - Compiler |sitioweb=ActiveState Docs |fechaacceso=2 de noviembre de 2016 |idioma=inglés |fechaarchivo=20 de octubre de 2016 |urlarchivo=https://web.archive.org/web/20161020160335/http://docs.activestate.com/tdk/4.1/Compiler.html |deadurl=yes }}</ref>
|paradigma = [[Lenguaje de programación multiparadigma|Multiparadigma]]: [[Programación orientada a objetos|POO]] , [[Programación funcional|funcional]], [[programación procedural|procedural]], [[Programación dirigida por eventos]]
|paradigma = [[Lenguaje de programación multiparadigma|Multiparadigma]]: [[Programación orientada a objetos|POO]] , [[Programación funcional|funcional]], [[programación procedural|procedural]], [[Programación dirigida por eventos]]
|año = [[1988]]
|año = 1988
|diseñador = [[John Ousterhout]]
|diseñador = [[John Ousterhout]]
|desarrollador = Tcl Core Team<ref>{{cita web|url=http://www.tcl.tk/community/coreteam/|título=Tcl Core Team|idioma=inglés}}</ref>
|desarrollador = Tcl Core Team<ref>{{cita web|url=http://www.tcl.tk/community/coreteam/|título=Tcl Core Team|idioma=inglés}}</ref>
|última_versión = 8.6.6<ref>{{cita web|url=https://sourceforge.net/projects/tcl/files/Tcl/8.6.6/tcltk-release-notes-8.6.6.txt/view|título=Latest Release: Tcl/Tk 8.6.6 (jul 27, 2016)|idioma=inglés|editorial=Tcl Developer Xchange Web Site.}}</ref>
|última_versión = 8.6.14<ref>{{cita web|url=http://www.tcl.tk/software/tcltk/8.6.html|título=Latest Release: Tcl/Tk 8.6.9|fecha=16 de noviembre de 2018|fechaacceso=17 de noviembre de 2018|idioma=inglés}}</ref>
|fecha_última_versión = {{Fecha de inicio|27|07|2016}}
|fecha_última_versión = {{Fecha de lanzamiento|28|02|2024}}
|web_última_versión = http://tcl.activestate.com/
|tipo_dato = Dinámico, cualquier cosa puede tratarse como una cadena
|tipo_dato = Dinámico, cualquier cosa puede tratarse como una cadena
|implementaciones = [[ActiveTcl]]
|implementaciones = [[ActiveTcl]]
Línea 20: Línea 21:
}}
}}


'''Tcl''' (pronunciado /tí.quel/, originado del acrónimo en [[idioma inglés|inglés]] "'''''T'''ool '''C'''ommand '''L'''anguage''" o "lenguaje de herramientas de comando", actualmente se escribe como "Tcl" en lugar de "TCL"), es un lenguaje de [[script]] creado por [[John Ousterhout]], que ha sido concebido con una [[sintaxis]] sencilla para facilitarse su aprendizaje, sin detrimento de la funcionalidad y expresividad.
'''Tcl''' (pronunciado /tí.quel/, originado del acrónimo en [[idioma inglés|inglés]] "'''''T'''ool '''C'''ommand '''L'''anguage''" o "lenguaje de herramientas de comando", actualmente se escribe como "Tcl" en lugar de "TCL"), es un lenguaje de [[script]] creado por [[John Ousterhout]], que ha sido concebido con una [[sintaxis]] sencilla para facilitarse su aprendizaje, sin detrimento de la funcionalidad y expresividad.


Se utiliza principalmente para el desarrollo rápido de prototipos, aplicaciones "script", [[Interfaz gráfica de usuario|interfaces gráficas]] y pruebas. La combinación de Tcl con [[Tk]] (del inglés '''''T'''ool '''K'''it'') es conocida como '''Tcl/Tk''', y se utiliza para la creación de interfaces gráficas.
Se utiliza principalmente para el desarrollo rápido de prototipos, aplicaciones "script", [[Interfaz gráfica de usuario|interfaces gráficas]] y pruebas. La combinación de Tcl con [[Tk]] (del inglés '''''T'''ool '''K'''it'') es conocida como '''Tcl/Tk''', y se utiliza para la creación de interfaces gráficas.
Línea 26: Línea 27:
== Características ==
== Características ==


Tcl es un [[lenguaje interpretado]], y su código puede ser creado y modificado dinámicamente. Sus [[Sintaxis|reglas sintácticas]] son extremadamente simples y posee reglas de alcance dinámico. Permite escribir código fácil de mantener. Los ''[[script]]s'' Tcl son a menudo más compactos y legibles que los programas funcionalmente equivalentes en otros [[Lenguaje de programación|lenguajes de programación]]. Es un lenguaje multiplataforma, con [[intérprete (informática)|intérpretes]] que se ejecutan sobre [[Windows]], [[Linux]], [[Unix|UNIX]], [[MacOS]] y [[Mac OS X|OSX]] e incluso microprocesadores PIC.
Tcl es un [[lenguaje interpretado]], y su código puede ser creado y modificado dinámicamente. Sus [[Sintaxis|reglas sintácticas]] son extremadamente simples y posee reglas de alcance dinámico. Permite escribir código fácil de mantener. Los ''[[script]]s'' Tcl son a menudo más compactos y legibles que los programas funcionalmente equivalentes en otros [[Lenguaje de programación|lenguajes de programación]]. Es un lenguaje multiplataforma, con [[intérprete (informática)|intérpretes]] que se ejecutan sobre [[Windows]], [[GNU/Linux|Linux]], [[Unix|UNIX]], [[MacOS]] y [[Mac OS X|OSX]] e incluso microprocesadores PIC.


Todos los elementos de un programa son comandos, incluyendo las estructuras del lenguaje. Dichos comandos se escriben en [[notación polaca]] y pueden ser redefinidos o sobreescritos de manera dinámica.
Todos los elementos de un programa son comandos, incluyendo las estructuras del lenguaje. Dichos comandos se escriben en [[notación polaca]] y pueden ser redefinidos o sobreescritos de manera dinámica.


Una característica notable es que los datos son manejados como [[Cadena de caracteres|cadenas de caracteres]] [[Unicode]], incluyendo el [[código fuente]], soportando [[Unicode]] desde el lanzamiento de la versión 8.1, en el año [[1999]].
Una característica notable es que los datos son manejados como [[Cadena de caracteres|cadenas de caracteres]] [[Unicode]], incluyendo el [[código fuente]], soportando [[Unicode]] 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 lenguaje [[C]], un integrado sumamente fácil. Tcl es "extensible" a través de [[Lenguaje de programación C|C]], [[C++]] y [[Lenguaje de programación Java|Java]]. 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 a [[entorno gráfico|entornos gráficos]], a través de una interfaz denominada [[Tk]].
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 lenguaje [[C (lenguaje de programación)|C]], un integrado sumamente fácil. Tcl es "extensible" a través de [[Lenguaje de programación C|C]], [[C++]] y [[Lenguaje de programación Java|Java]]. 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 a [[entorno gráfico|entornos gráficos]], a través de una interfaz denominada [[Tk]].


La [[programación orientada a eventos]] se realiza sobre ''[[socket Unix|sockets]]'' y [[archivo (informática)|archivos]], además son posibles los eventos basados en tiempo y los definidos por el usuario.
La [[programación orientada a eventos]] se realiza sobre ''[[socket Unix|sockets]]'' y [[archivo (informática)|archivos]], además son posibles los eventos basados en tiempo y los definidos por el usuario.


== Antecedentes ==
== Antecedentes ==
[[Archivo:Tk menu1.gif|right|thumb|150px|Ejemplo de un menú realizado con Tcl/Tk.]]
[[Archivo:Tk menu1.gif|derecha|miniaturadeimagen|150px|Ejemplo de un menú realizado con Tcl/Tk.]]


El lenguaje Tcl fue originalmente proyectado para ser un [[Lenguaje de programación|lenguaje]] 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.
El lenguaje Tcl fue originalmente proyectado para ser un [[Lenguaje de programación|lenguaje]] 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és ''Tool Command Language''), cuyas siglas en español significan "Lenguaje de Herramientas de Comando".
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és ''Tool Command Language''), cuyas siglas en español significan "Lenguaje de Herramientas de Comando".
Línea 48: Línea 49:


== Sintaxis y semántica fundamental ==
== Sintaxis y semántica fundamental ==
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 caracter de nueva línea o un punto y coma.
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
palabra0 palabra1 palabra2 ... palabraN
Línea 58: Línea 59:
Un ejemplo práctico, usando el comando ''puts'' el cual envía una cadena de caracteres a una salida (añadiendo una nueva línea al final) en forma predeterminada sobre el canal ''stdout'':
Un ejemplo práctico, usando el comando ''puts'' el cual envía una cadena de caracteres a una salida (añadiendo una nueva línea al final) en forma predeterminada sobre el canal ''stdout'':


<source lang="tcl">
<syntaxhighlight lang="tcl">
puts "Hola, mundo!"
puts "Hola, mundo!"
</syntaxhighlight>
</source>


Las variables y los resultados de otros comandos pueden introducirse también dentro de las cadenas de caracteres, tal como en este ejemplo donde usamos ''set'' (comando de asignación de variables) y ''expr'' (comando de expresiones artiméticas) para almacenar el resultado de un cálculo en una variable, y ''puts'' para imprimir el resultado junto con un texto explicativo:
Las variables y los resultados de otros comandos pueden introducirse también dentro de las cadenas de caracteres, tal como en este ejemplo donde usamos ''set'' (comando de asignación de variables) y ''expr'' (comando de expresiones aritméticas) para almacenar el resultado de un cálculo en una variable, y ''puts'' para imprimir el resultado junto con un texto explicativo:
<source lang="tcl">
<syntaxhighlight lang="tcl">
set suma [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+5
set suma [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+5
puts "La suma de los números 1..5 es $suma." ;#muestra una cadena de caracteres con el resultado almacenado en la variable suma
puts "La suma de los números 1..5 es $suma." ;#muestra una cadena de caracteres con el resultado almacenado en la variable suma
</syntaxhighlight>
</source>


El punto y coma <code>;</code> 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 <code>#</code>):
El punto y coma <code>;</code> 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 <code>#</code>):
<source lang="tcl">
<syntaxhighlight lang="tcl">
#Comentario en una línea sin comandos
#Comentario en una línea sin comandos
puts "¡Hola Mundo!" ; puts "otra linea de caracteres"
puts "¡Hola Mundo!" ; puts "otra linea de caracteres"
set i 0 ; #Comentario, con un ';' para separarlo del comando
set i 0 ; #Comentario, con un ';' para separarlo del comando
</syntaxhighlight>
</source>


=== Agrupamiento ===
=== Agrupamiento ===
Línea 80: Línea 81:
* Con <code>""</code> (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 <code>""</code> (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 <code>{}</code> (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 (invocando <code>tclsh</code> en un terminal):
* Con <code>{}</code> (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 (invocando <code>tclsh</code> en un terminal):
<source lang="tcl">
<syntaxhighlight lang="tcl">
% set numero 545 ;#Asignación a la variable numero con 545
% set numero 545 ;#Asignación a la variable numero con 545
545
545
% puts "El valor es $numero" ;# Con dobles comillas podemos poner el contenido de la variable numero
% puts "El valor es $numero" ;# Con dobles comillas podemos poner el contenido de la variable numero
El valor es 545
El valor es 545
% puts {El valor es $numero} ;# Pero entre llaves muestra el simbolo $ seguido del nombre de la variable
% puts {El valor es $numero} ;# Pero entre llaves muestra el símbolo $ seguido del nombre de la variable
El valor es $numero
El valor es $numero
</syntaxhighlight>
</source>
Los bloques entre llaves sirven además para las estructuras de control, ya que son tratadas como cualquier otro comando.
Los bloques entre llaves sirven además para las estructuras de control, ya que son tratadas como cualquier otro comando.
* Los <code>()</code> (paréntesis) sirven para encerrar los índices en las tablas asociativas, o para agrupar en expresiones aritméticas.
* Los <code>()</code> (paréntesis) sirven para encerrar los índices en las tablas asociativas, o para agrupar en expresiones aritméticas.
* Con <code>[]</code> (bloques entre corchetes) se realiza la sustitución del contenido de un resultado, por ejemplo, en una consola tcl:
* Con <code>[]</code> (bloques entre corchetes) se realiza la sustitución del contenido de un resultado, por ejemplo, en una consola tcl:
<source lang="tcl">
<syntaxhighlight lang="tcl">
% puts [ expr {1 + [set u 342]} ] ; # Muestra el resultado de la expresión de sumarle 1 a la variable u que se le asigna antes 342
% puts [ expr {1 + [set u 342]} ] ; # Muestra el resultado de la expresión de sumarle 1 a la variable u que se le asigna antes 342
343
343
% puts $u ;# Muestra el contenido de u
% puts $u ;# Muestra el contenido de u
342
342
</syntaxhighlight>
</source>


=== Tipos de variables ===
=== Tipos de variables ===
Línea 103: Línea 104:


* '''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
* '''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.
* '''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}
* '''Cadenas de caracteres''' : Bienvenido, "Madame De Labas", 32 , {z 3.14}
* '''Listas''' : de booleanas, nombres, cadenas o listas (pudiendo anidar listas)
* '''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.
* '''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.
* '''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:
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:
<source lang="tcl">
<syntaxhighlight lang="tcl">
% set frutas albaricoque
% set frutas albaricoque
% puts $frutas
% puts $frutas
Línea 120: Línea 121:
% puts [lindex $frutas 1]
% puts [lindex $frutas 1]
naranja
naranja
</syntaxhighlight>
</source>


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.
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.


=== Estructuras de control ===
=== Estructuras de control ===

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.
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.


<source lang="tcl">
<syntaxhighlight lang="tcl">
while { unaExpresionLogica } {
while { unaExpresionLogica } {
unCommando
unCommando
Línea 172: Línea 173:
default { puts "desconocido" }
default { puts "desconocido" }
}
}
</syntaxhighlight>
</source>


== Ejemplos ==
== Ejemplos ==


* Factorial (estilo de [[programación funcional]]):
* Factorial (estilo de [[programación funcional]]):
<source lang="tcl">
<syntaxhighlight lang="tcl">
proc ! x {expr {$x<2? 1: $x*[! [incr x -1]]}}
proc ! x {expr {$x<2? 1: $x*[! [incr x -1]]}}
</syntaxhighlight>
</source>


* Hacer la suma de una lista de números
* Hacer la suma de una lista de números
Con un bucle ''foreach'' que sigue la lista :
Con un bucle ''foreach'' que sigue la lista :
<source lang="tcl">
<syntaxhighlight lang="tcl">
set numeros {10 9 8 7 6 5 4 3 2 1}
set numeros {10 9 8 7 6 5 4 3 2 1}
set suma 0
set suma 0
Línea 189: Línea 190:
set suma [expr {$suma + $i}]
set suma [expr {$suma + $i}]
}
}
</syntaxhighlight>
</source>
O más compacto utilizando el comando <code>join</code> en lugar del lazo con foreach :
O más compacto utilizando el comando <code>join</code> en lugar del lazo con foreach :
<source lang="tcl">
<syntaxhighlight lang="tcl">
set suma [expr [join $numeros +]]
set suma [expr [join $numeros +]]
</syntaxhighlight>
</source>
* Un operador es un caracter como cualquier otro, así que puede ser almacenado en una variable:
* Un operador es un carácter como cualquier otro, así que puede ser almacenado en una variable:
<source lang="tcl">
<syntaxhighlight lang="tcl">
set numeros {10 9 8 7 6 5 4 3 2 1}
set numeros {10 9 8 7 6 5 4 3 2 1}
foreach opr {+ * - /} {
foreach opr {+ * - /} {
Línea 201: Línea 202:
puts "El resultado para el operador $opr es $resultado"
puts "El resultado para el operador $opr es $resultado"
}
}
</syntaxhighlight>
</source>
* Descarga de una página [[Hypertext Markup Language|HTML]]
* Descarga de una página [[Hypertext Markup Language|HTML]]
<source lang="tcl">
<syntaxhighlight lang="tcl">
package require http
package require http
set tok [http::geturl http://es.wikipedia.org/wiki/Tcl]
set tok [http::geturl http://es.wikipedia.org/wiki/Tcl]
puts [http::data $tok]
puts [http::data $tok]
http::cleanup $tok
http::cleanup $tok
</syntaxhighlight>
</source>


== Desarrollo y ejecución ==
== Desarrollo y ejecución ==


[[Archivo:Eclipse-dltk-itcl en fedora 11 con KDE 4.2.4.png|thumb|250px|Eclipse corriendo un programa Tcl que utiliza la extensión [[incr Tcl]] para la programación orientada a objetos.]]
[[Archivo:Eclipse-dltk-itcl en fedora 11 con KDE 4.2.4.png|miniaturadeimagen|250px|Eclipse corriendo un programa Tcl que utiliza la extensión [[incr Tcl]] para la programación orientada a objetos.]]
En [[Linux]] y otras plataformas de derivados de [[Unix]], 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:
En [[GNU/Linux|Linux]] y otras plataformas de derivados de [[Unix]], 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:


<div style="width:250px;"><source lang=bash>
<div style="width:250px;"><syntaxhighlight lang="bash">
$ tclsh archivo.tcl
$ tclsh archivo.tcl
</source></div>
</syntaxhighlight></div>


También se puede obtener una consola Tcl escribiendo en ella solamente <code>tclsh</code>. Existen otras consolas para Tcl, como TkCon, que es un intérprete mejorado escrito por Jeff Hobbs.<ref>{{cita web|url=http://www.tcl.tk/man/tcl8.5/tutorial/Tcl0a.html|título=Tcl Tutorial: Running Tcl|editorial=Tcl Developer Xchange|idioma=inglés}}</ref> La programación de Tcl/Tk es soportada por gran variedad de [[entorno de desarrollo integrado|IDEs]], tal como [[Eclipse (software)|Eclipse]] a través del proyecto [[DLTK]] (Dynamic Languages Toolkit), que contiene plugins para compiladores de lenguajes dinámicos Tcl, [[Ruby]], [[Javascript]] y [[Python]].<ref>{{cita web|url=http://www.eclipse.org/dltk/|título=Dynamic Languages ToolKit|idioma=inglés|editorial=The Eclipse Foundation}}</ref>
También se puede obtener una consola Tcl escribiendo en ella solamente <code>tclsh</code>. Existen otras consolas para Tcl, como TkCon, que es un intérprete mejorado escrito por Jeff Hobbs.<ref>{{cita web|url=http://www.tcl.tk/man/tcl8.5/tutorial/Tcl0a.html|título=Tcl Tutorial: Running Tcl|editorial=Tcl Developer Xchange|idioma=inglés}}</ref> La programación de Tcl/Tk es soportada por gran variedad de [[entorno de desarrollo integrado|IDEs]], tal como [[Eclipse (software)|Eclipse]] a través del proyecto [[DLTK]] (Dynamic Languages Toolkit), que contiene plugins para compiladores de lenguajes dinámicos Tcl, [[Ruby]], [[Javascript]] y [[Python]].<ref>{{cita web|url=http://www.eclipse.org/dltk/|título=Dynamic Languages ToolKit|idioma=inglés|editorial=The Eclipse Foundation}}</ref>
Línea 229: Línea 230:
Ejemplo:
Ejemplo:


<source lang="tcl">
<syntaxhighlight lang="tcl">
oo::class create DistribuidorTicket {
oo::class create DistribuidorTicket {
variable contador
variable contador
Línea 245: Línea 246:
set macommande [DistribuidorTicket new]
set macommande [DistribuidorTicket new]
$macommande entregaTicket 2
$macommande entregaTicket 2
</syntaxhighlight>
</source>


Tcl no contaba en sus orígenes con construcciones específicas en su sintaxis para soportar el paradigma de la [[programació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.
Tcl no contaba en sus orígenes con construcciones específicas en su sintaxis para soportar el paradigma de la [[programació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.
Línea 269: Línea 270:
== Enlaces externos ==
== Enlaces externos ==
{{commonscat|Tcl programming language family}}
{{commonscat|Tcl programming language family}}
{{wikibooks|en:Tcl Programming|Programación en Tcl (en inglés)}}
{{wikibooks|en:Tcl Programming|Programación en Tcl (en inglés)}}
* [http://www.tcl.tk Tcl Developer Xchange] sitio oficial (en inglés)
* [http://www.tcl.tk Tcl Developer Xchange] sitio oficial (en inglés)
* [http://www.tcl.tk/man/tcl8.6/contents.htm Tcl8.6.5/Tk8.6.5 Documentation] (en inglés)
* [http://www.tcl.tk/man/tcl8.6/contents.htm Tcl8.6.5/Tk8.6.5 Documentation] (en inglés)
Línea 279: Línea 280:
* [http://tcljava.sourceforge.net/docs/website/index.html Tcl/Java] Integración de Tcl en la [[plataforma Java]] (en inglés)
* [http://tcljava.sourceforge.net/docs/website/index.html Tcl/Java] Integración de Tcl en la [[plataforma Java]] (en inglés)
* [http://search.cpan.org/perldoc?Tcl Tcl] Módulo [[Perl]] para acceder a la biblioteca de Tcl (en inglés)
* [http://search.cpan.org/perldoc?Tcl Tcl] Módulo [[Perl]] para acceder a la biblioteca de Tcl (en inglés)

{{Control de autoridades}}


[[Categoría:Tcl| ]]
[[Categoría:Tcl| ]]
[[Categoría:Siglas de informática]]
[[Categoría:Lenguajes interpretados]]
[[Categoría:Lenguajes interpretados]]
[[Categoría:Lenguajes de programación orientada a objetos]]
[[Categoría:Lenguajes de programación orientada a objetos]]
[[Categoría:Lenguajes de programación dinámicamente tipados]]
[[Categoría:Lenguajes de programación dinámicamente tipados]]
[[Categoría:Acrónimos de informática]]
[[Categoría:Software de 1988]]

Revisión actual - 18:01 2 mar 2024

Tcl
Tool Command Language
Desarrollador(es)
Tcl Core Team[1]
https://tcl.tk
Información general
Extensiones comunes .tcl, .tbc[2]
Paradigma Multiparadigma: POO , funcional, procedural, Programación dirigida por eventos
Apareció en 1988
Diseñado por John Ousterhout
Última versión estable 8.6.14[3](28 de febrero de 2024 (4 meses y 15 días))
Sistema de tipos Dinámico, cualquier cosa puede tratarse como una cadena
Implementaciones ActiveTcl
Influido por C, Lisp, Shell, Awk, SCL
Ha influido a Python, PowerShell[4]
Sistema operativo Multiplataforma
Licencia BSD

Tcl (pronunciado /tí.quel/, originado del acrónimo en inglés "Tool Command Language" o "lenguaje de herramientas de comando", actualmente se escribe como "Tcl" en lugar de "TCL"), es un lenguaje de script creado por John Ousterhout, que ha sido concebido con una sintaxis 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 con Tk (del inglés Tool Kit) es conocida como Tcl/Tk, y se utiliza para la creación de interfaces gráficas.

Características[editar]

Tcl es un lenguaje interpretado, y su código puede ser creado y modificado dinámicamente. Sus reglas sintácticas son extremadamente simples y posee reglas de alcance dinámico. Permite escribir código fácil de mantener. Los scripts Tcl son a menudo más compactos y legibles que los programas funcionalmente equivalentes en otros lenguajes de programación. Es un lenguaje multiplataforma, con intérpretes que se ejecutan sobre Windows, Linux, UNIX, MacOS y OSX e incluso microprocesadores PIC.

Todos los elementos de un programa son comandos, incluyendo las estructuras del lenguaje. Dichos comandos se escriben en notación polaca y pueden ser redefinidos o sobreescritos de manera dinámica.

Una característica notable es que los datos son manejados como cadenas de caracteres Unicode, incluyendo el código fuente, soportando Unicode 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 lenguaje C, un integrado sumamente fácil. Tcl es "extensible" a través de C, C++ y Java. 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 a entornos gráficos, a través de una interfaz denominada Tk.

La programación orientada a eventos se realiza sobre sockets y archivos, además son posibles los eventos basados en tiempo y los definidos por el usuario.

Antecedentes[editar]

Ejemplo de un menú realizado con Tcl/Tk.

El lenguaje Tcl fue originalmente proyectado para ser un lenguaje 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és Tool 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 la biblioteca Tk (de Tool Kit, en español, caja de herramientas), un conjunto de comandos y procedimientos que hacen relativamente fácil para programar interfaces 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.

Sintaxis y semántica fundamental[editar]

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 una biblioteca. Las siguientes palabras son los argumentos. Así se tiene:

nombreComando argumento1 argumento2 ... argumentoN

Un ejemplo práctico, usando el comando puts el cual envía una cadena de caracteres a una salida (añadiendo una nueva línea al final) en forma predeterminada sobre el canal stdout:

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 usamos set (comando de asignación de variables) y expr (comando de expresiones aritméticas) para almacenar el resultado de un cálculo en una variable, y puts para imprimir el resultado junto con un texto explicativo:

set suma [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+5
puts "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 comandos
puts "¡Hola Mundo!" ; puts "otra linea de caracteres"
set i 0 ; #Comentario, con un ';' para separarlo del comando

Agrupamiento[editar]

Las formas de agrupar elementos en Tcl son:

  • 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 (invocando tclsh en un terminal):
% set numero 545 ;#Asignación a la variable numero con 545
545
% puts "El valor es $numero" ;# Con dobles comillas podemos poner el contenido de la variable numero
El valor es 545
% puts {El valor es $numero} ;# Pero entre llaves muestra el símbolo $ seguido del nombre de la variable
El valor es $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 + [set u 342]} ] ; # Muestra el resultado de la expresión de sumarle 1 a la variable u que se le asigna antes 342
343
% puts $u ;# Muestra el contenido de u
342

Tipos de variables[editar]

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:

% set frutas albaricoque
% puts $frutas
albaricoque
% set frutas "pomelo naranja banana"
pomelo naranja banana
% puts [lindex $frutas end]
banana
% puts [lindex $frutas 1]
naranja

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.

Estructuras de control[editar]

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 }   { 
      unCommando
      unCommando
      ....
  }

  if {$x<0} {
     set x 0
  } elseif { $x<5 } {
     set x 5
  } else {
     set x 10
  }

  for {set i 0} {$i<10} {incr i} { 
      puts $i 
  }

  foreach i [list "youpii" "aujourd'hui" "il fait beau" "bravo !" "bravo !"] {
      puts $i
  }
  # no es necesario usar el comando list con valores fijos; esto es equivalente
  foreach i {"youpii" "aujourd'hui" "il fait beau" "bravo !" "bravo !"} {
      puts $i
  }

  foreach a $listaA  b $listaB  c $listaC {
      puts "$a $b $c"
  }

  foreach {x y} [list Sr Gaston Sra Jeanne Sr Robert Sra Raymonde] {
      puts "$x $y"
  }

  set color azul
  switch $color {
    rojo   { puts "FF0000" }
    azul   { puts "0000FF" }
    verde  { puts "00FF00" }
    blanco { puts "FFFFFF" }
    negro  { puts "000000" }
    default { puts "desconocido" }
  }

Ejemplos[editar]

proc ! x {expr {$x<2? 1: $x*[! [incr x -1]]}}
  • Hacer la suma de una lista de números

Con un bucle foreach que sigue la lista :

set numeros {10 9 8 7 6 5 4 3 2 1}
set suma 0
foreach i $numeros { 
   set suma [expr {$suma + $i}]
}

O más compacto utilizando el comando join en lugar del lazo con foreach :

set suma [expr [join $numeros +]]
  • Un operador es un carácter como cualquier otro, así que puede ser almacenado en una variable:
set numeros {10 9 8 7 6 5 4 3 2 1}
foreach opr {+ * - /} {
   set resultado [expr [join $numeros $opr]]
   puts "El resultado para el operador $opr es $resultado"
}
  • Descarga de una página HTML
package require http
set tok [http::geturl http://es.wikipedia.org/wiki/Tcl]
puts [http::data $tok]
http::cleanup $tok

Desarrollo y ejecución[editar]

Eclipse corriendo un programa Tcl que utiliza la extensión incr Tcl para la programación orientada a objetos.

En Linux y otras plataformas de derivados de Unix, 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:

$ tclsh archivo.tcl

También se puede obtener una consola Tcl escribiendo en ella solamente tclsh. 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 de IDEs, tal como Eclipse a través del proyecto DLTK (Dynamic Languages Toolkit), que contiene plugins para compiladores de lenguajes dinámicos Tcl, Ruby, Javascript y Python.[6]

Programación orientada a objetos[editar]

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::class create DistribuidorTicket {
  variable contador
    
  constructor {} {set contador 0}
  
  method entregaTicket {{ticket 1}} {  
      incr contador
        for {set i 0} {$i < $ticket} {incr i} {
           puts "Entrega del ticket n° $i para el control $contador"
        }
  }
}

set macommande [DistribuidorTicket new]
$macommande entregaTicket 2

Tcl no contaba en sus orígenes con construcciones específicas en su sintaxis para soportar el paradigma de la programació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 en XOTcl,[7]​ buscando unificar a las demás extensiones.

Extensión Desarrollado con Descripción del modelado
XOTcl[8] C Definición dinámica de clases, metaclases y métodos con introspección. Herencia simple y múltiple. Agregación de objetos dinámicos, clases anidadas, mixins, filtro condicional, ranuras. Influido por CLOS, Smalltalk y Self.
incr Tcl C Basado en el modelo de C++. Herencia múltiple. Clases privadas y públicas.
OTcl[9] C

Definición dinámica de clases, metaclases y métodos con introspección. Herencia simple y múltiple. Influido por CLOS, Smalltalk y Self.

Snit[10] Tcl 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.

Referencias[editar]

  1. «Tcl Core Team» (en inglés). 
  2. «Tcl Dev Kit - Compiler». ActiveState Docs (en inglés). Archivado desde el original el 20 de octubre de 2016. Consultado el 2 de noviembre de 2016. 
  3. «Latest Release: Tcl/Tk 8.6.9» (en inglés). 16 de noviembre de 2018. Consultado el 17 de noviembre de 2018. 
  4. Jeffrey Snover. «PowerShell and WPF: WTF» (en inglés). Microsoft Developer Network. 
  5. «Tcl Tutorial: Running Tcl» (en inglés). Tcl Developer Xchange. 
  6. «Dynamic Languages ToolKit» (en inglés). The Eclipse Foundation. 
  7. «Object-Oriented Programming in Tcl» (en inglés). Consultado el 8 de febrero de 2011. 
  8. «Extended Object Tcl (XOTcl)» (en inglés). 
  9. «MIT Object Tcl (OTcl)» (en inglés). 
  10. «Snit's Not Incr Tcl» (en inglés). 

Enlaces externos[editar]

Implementaciones