=-[ 0x15 ]-==================================================================
=-[ NetSearch Ezine #7 ]-====================================================
=-[ Introduccion al TCL ]-===================================================
=-[ Por ajX ]-===============================================================


INDICE            


PROGRAMACION EN TCL(I)
1. Introduccion a tcl

2. Primeros contactos con el interprete

3. Sintaxis 
	3.1. Variables
	3.2. Comentarios
	3.3. Las comillas
	3.4. Expresiones matematicas

4. Sintaxis II (Cadenas de caracteres)
	4.1. Comando append
	4.2. Format
	4.3. Scan

5. Sintaxis III (Controles de flujo)
	5.1. If, then, else
	5.2. Switch
	5.3. For
	5.4. Foreach
	5.5. While
	5.6. Break, continue, return
	5.7. Catch
	5.8. Case



PROGRAMACION EN TCL (II)
6. Sintaxis IV (Estructuras de datos)
	6.1. Listas tcl
	6.2. Construccion de listas 
	6.3. Localizacion de elementos
	6.4. Modificacion de listas
	6.5. Buscar elementos en una lista
	6.6. Split y Join
	6.7. Arrays
	6.8. Variables de entorno
	6.9. Foreach

7. Sintaxis V (Procedimientos)
	7.1. Proc
	7.2. Global
	7.3. Tclindex
	7.4. Auto_Path
	7.5. Unknow
	7.6. Carga de ficheros

8. Sintaxis VI (Tratamiento de ficheros en Tcl)
	8.1. File
	8.2. E/S
	8.3. Abrir ficheros
	8.4. Lectura y escritura

9. Hacemos alguna chorradilla.

PROGRAMACION EN TCL (III)
10. Sintaxis VII (Un poco mas de Tcl)

11. Bugs

12. Tcl/Tk para UNIX

13. Tlc y C

14. Creacion de una aplicacion cliente/servidor con c y tcl (a  ke suena bien.. mooola)





1. INTRODUCCION

Bienvenidos a la primera entraga del curso de tcl by ajX. Este lenguaje de programacion es interpretado y multiplataforma, que quiere decir esto, que es un lenguaje de comandos que puede ser utilizado para los SOs  Windows y Unix. En este numero de headache incluiremos el compilador para que empeceis a practicar.

El interprete de tcl es el tclsh o tclsh 8 para tcl/tk 8.0, tk es una extension que permite realizar algunas funciones graficas como botones, ventanas, colores, etc, y que cuyo interprete incluiremos  en la e-zine. Tambien existen otras extensiones como BLT (permite hace funciones graficas en dos dimensiones), itcl (incremental tcl, permite reailizar una programacion orientada a objetos) y OraTcl (Permite manejar bases de datos oracle), y hay muchas mas aunque el que mas se conoce es la extension tk.

Y pensareis PARA QUE NECESITO SABER TCL EIN??? pues muy sencillo, tlc es un lenguaje de programacion muy, pero que muy facil de manejar, y que con el podreis hacer infinidad de aplicaciones cliente/servidor y para la inet  facilmente (sockets, troyanetes, etc..). Otra cosa que merece mencionar es que se puede implementar codigo de c/c++.  
Una cosa antes de pasar al siguiente tema es que para podere ejecutar los programas de tcl es necesario  el interprete.

Aviso: tcl es un lenguaje de script, no penseis en c o en otro lenguaje cuando programeis en tcl (aunque no hay tanta diferencia)

Ahora explicaremos la sintaxis y todos sus comandos:


2. PRIMEROS CONTACTOS CON EL INTERPRETE

Cuando instalas el pakete te crea en windows  en el menu de inicio/programas/tcl/ 5 archivos, dos de ellos son las interpretes, una para dos, que solo rula tcl, y otra para windows que rula tcl/tk al completo.
La interprete para dos se llama Tclsh, y la de windows Wish. Esta ultima es la que os recomiendo utilizar ya que es mas comoda y tiene algunos menus adicionales. Cuando ejecutas la interprete Wish veras que aparece una ventanita gris, no la toques ya que es para programar con la extension tk que en un futuro se hablara en esta enzine. xDDD.
Una cualidad de la consola que merece mencionar (muy parecida a la de unix) es que puedes moverte por el arbol de directorios con los comandos cd y pwd.
Una cosa interesante de tcl es su consola, como podeis observar en el ejemplo al asignar 	valor a la variable escribe 1, realiza la accion en el instante, por lo tanto si estubiera mal su sintaxis lo sabrias en el momento.


Ahora vamos a explicar unos comandos basicos que utilizareis con frecuencia posteriormente en la creacion de vuestros scripts. 
 

	SOURCE (source nombre_fichero)
	Permite cargar cualquier archivo. Si el archivo contiene codigo se ejecutara, y si tiene procedimiento quedaran guardados en memoria

	HISTORY 
	Presenta la lista de comandos utilizados hasta el momento

	INFO BODY (info body procedimiento)
	Presenta la el codigo del procedimiento que indiquemos

	INFO VAR 
	Presenta la lista de variables en la consola

En el interprete de ms-dos op unix (tclsh) podemos utilizar el conocido cls, pa borrados de pantalla.


3. SINTAXIS 

	3.1. VARIABLES

	
Las variables en tcl son siempre de tipo string, eso que quede bien claro. Para asignar un valor a una varriable se empleara el comando set variable   valor_a_asignar. Para sacar el valor de una variable se utiliazara el signo dolar ($), esto se uilizara para asignar el valor de una variable a otra.
En tcl no hace falta declarar variables ya que al utilizar set las crea automaticamente, para ver todas las variables que se esta utilizando se utilizara el comando INFO VAR del que antes ya hemos hablado. 

	Para desacernos de una variables utilizaremos el comando UNSET (unset variable).

	ej
 	% set headache 1
	1 
   	 #asignamos a la variable headache el valor 1
	& set numero &headache
	1
	#asignamos a la variable numero el valor de headache, por lo tanto valdra 	1
                 

	
	3.2 COMENTARIOS


Como habeis visto en el apartado anterior he incluido unos comentarios. Los comentarios en Tcl se escriben seguidos de el signo de almohadilla  (#) facil no??
	

	3.3. LAS COMILLAS


Como en otros lenguajes de programacion, sean estructurados o como tcl, las comillas, los corchetes y las llaves diempren han tenido un lugar muy importante. En tcl las comillas y llaves se utilizan principalmente para escribir cadenas de caracteres al igual q las llaves pero con una clara 	diferencia, con las llaves no podemos utilizar variables, veamoslo con un claro ejemplo.
	
	ej
	% set numero uno
	uno
	%puts  "Estas leyendo el numero $numero de HeadachE"
	Estas leyendo el numero uno de HeadachE"
	%puts {Estas leyendo el numero $numero de HeadachE}
	Estas leyendo el numero $numero de HeadachE

	Como ves hay una gran diferencia entre usar comillas y llaves no?? 
	
El uso de corchetes en tcl va orientado principalmente a las funciones 	matematicas asi que seran explicados en el siguiente apartado... 


	3.4. EXPRESIONES MATEMATICAS

	
Las variable en tcl como ya hemos comentado anteriorment son de cadenas de caracteres, osea STRING, por lo tanto tendremos que pasarlas a numericas para poder realizar las operaciones que vengan al caso. Para esto en tcl existe un funcion llamada expr, para escribir una expresion matematica o una funcion deberemos escribir antes la palabra expr. Por si aun no os habeis enterado pondre un sencillo ejemplo.

	% expr 2+3
 	5
	% expr 20/10
	2
	&set variable [expr 4*(2+3)]
	20

Como veis en el ejemplo hemos utilizado la palabra expr para escribir la expresion 2+3, y si habeis sido observadores hemos utilizado los corchete  y como no aprovechare esto para explicarlos. Los corchetes serautilizados al dar un valor a una variable darselo en forma de expresion o funcion 	matematica, en este caso le hemos dado el valor 20 pero tambien podemos utlizar la funcion rand para dar a la variable un valor aleatorio, etc...

Aki os pongo una lista de los operadores y las funciones sacadas de un manual que tenia 	por ahi (que quereis, son muchas y mi cabeza no es la de  antes, xDD)


	      OPERADORES ARITMETICOS

                 - ~ !
                               Menos, NOT a nivel de bits, NOT lgico.
                * / %
                               Multiplicacin, divisin, resto.
                + -
                               Adicin, sustraccin.
                << >>
                               Desplazamiento a la izquierda y a la derecha.
                < > <= >=
                               Comparacin: menor, mayor, menor o igual, mayor o igual.
                == !=
                               Igual, no igual.
                &
                               AND a nivel de bits.
                 
                               NOT a nivel de bits.
                |
                               OR a nivel de bits.
                &&
                               AND lgico.
                | |
                               OR lgico.
                x?y:z
                               Si x entonces y, sino z.



                                  FUNCIONES MATEMATICAS
                acos( x )
                             ArcoCoseno de x.
                asn( x )
                             ArcSeno de x.
                atan( x )
                             Arcotangente de x.
                atan2( y,x )
                             De rectangulares ( x,y ) a polares (r, th ). atan2 devuelve th.
                ceil ( x )
                             Primer valor entero mayor o igual que x.
                cos( x )
                             Coseno de x.
                cosh( x )
                             Coseno hiperblico de x.
                exp( x )
                             Exponencial de x.
                floor( x )
                             Primer valor entero menor o igual que x.
                fmod( x, y )
                             valor en coma flotante resto de x/y.
                hypot( x, y )
                             Devuelve sqrt(x*x + y*y).
                log( x )
                             Logaritmo natural de x.                                                                                                                                   
                log10( x )
                             Logaritmo en base 10 de x.
                pow( x,y )
                             x elevado a y.
                sin( x )
                             Seno de x.
                sinh( x )
                             Seno hiperblico de x.
                sqrt( x )
                             raz cuadrada de x.
                tan( x )
                             Tangente de x.
                tanh( x )
                             Tangente hiperblica de x.
                abs( x )
                             valor absoluto de x.
                double( x )
                             Convierte a x en un valor en coma flotante.
                int( x )
                             trunca x a un entero.
                rand()
                             Genera un nmero aletario entre 0 y 1. la semilla puede venir del
                             reloj o inicializarse mediante srand.
                round( x )
                             Redondea x a un entero.
                srand(arg)
                             Donde arg debe de ser un entero. Inicializa la semilla para la
                             generacin de nmeros aleatorios.

	
	Antes de pasar al siguiente apartado me gustaria decir algo sobre los decimales, lo normal es que la consola solo escriba 5 decimales, si queremos que este numero aumente modificaremos la variable tcl_precision con la funcion set. 
                                                                 


4. SINTAXIS II (Cadenas de caracteres)


Como ya he mencionado antes todas las variables de tcl son string, por lo tanto existen muchos comandos para tratar las cadenas de caracteres. Uno de ellos es el comando string, que sirve para realizar distintas operaciones con las cadenas de caracteres: comparar, pasar a mayusculas, a minusculas,etc.
Aki va una tabla con todas las posibilidades de el comando string que saque de un manual:
	Sintaxis   --->         string   operacion    el_string    argumentos



TABLA DEL COMANDO STRING

             string compare string1 string2
                                          Compara dos strings. 0 si son iguales, 1 si una es una
                                          subcadena de la otra, -1 en otro caso.
         
            string index string index
                                           Devuelve el caracter situado en el indice indicado.
       
            string length string
                                          Devuelve la longitud del string.
        
            string match patter string
                                          Devuelve 1 si hay coincidencias, 0 si no.
            
              string range string i j
                                          Devuelve los caracteres entre i y j.
           
             string tolower string
                                          Pasa a minsculas el string.
             
             string toupper string
                                          Pasa a maysculas el string.
 
Ahora veremos otros comandos tambien de tratamiento de cadenas string...


	4.1. COMANDO APPEND


  El comando append sirve para concatenar, concatena unas determinadas cadenas de caracteres y devuelve el resultado a una variable, que si no existia la crea en el momento.El comando append seria algo asi ----> append variable $string1 $string2 $string3,El contenido de las variables string1, string2, string3, se "unira" formando una sola cadena de caracteres que sera el nuevo valor de la variable variable (xD, se entiende no?).
	Aki va un ejemplo:
	
	ej.
	% set string1 super 
     	super 
  	% set string2 califragilistico 
	califragilistico
	%set string3 espiaridoso
	espiaridoso
	% append frasecilla  $string1 $string2 $string2 
 	supercalifragilisticoespiaridoso
	#y si ahora hacemos un set (mostramos la variable).
	% set frasecilla
	supercalifragilisticoespiaridoso

	4.2 FORMAT
	

Este comando como dice la palabra da formato a una cadena de caracteres.
Este comando es bastante importante ya que podremos comvertir cualquier variables a los que nos salga.
	 Vamos  con la sintaxis --> format   el_formato valor1 valor2 valorquetecuen...
Donde el_formato pondremos unos valores especificos dados en las siguientes tablas (a ke me ha kedao bien xD) Como ponemos el formato? Por que en realidad hay una manera, un orden o un metodo o como quieras llamarlo. Primero pondremos comillas ( ") luego porcentaje (%), luego un modificador especial (flags de formato)  y mas tarde  los indicadores de conversion y cerramos comillas. En el valor1 o valor2 pondremos la cadena que queremos  transformar o dar formato, puede ser una variable o cualquier cosa..
Aki abajo pongo unas tablas que os resultaran muy utiles:
              

	TABLA DE INDICADORES DE CONVERSION

    	d
	                      Entero con signo.
     	u
              	    	    Entero sin signo.
     	i
                 		    Entero con signo. El argumento puede ir en hexadecimal(0x) o en octal(0).
   	   o
                  		   Octal sin signo.
     	x o X
                  		   Hexadecimal sin signo.
     	c
                  		   Carcter ASCII de un entero.
     	s
                  		   String.
     	f
                  		   Nmero en coma flotante en formato a.b.
   	e o E
                  		   Nmero en coma flotante en notacin cientfica
  	g o G
                  		   Nmero en coma flotante.


	TABLA DE FLAGS DE FORMATO
	
	-
                  	  Justificar a la izquierda el campo.
      	+
                 		  Incluir signo.
      	espacio
                 		  Nmero precedido de un espacio.
      	0
                 		  Rellenar con ceros.
      	#
              		  Coloca un 0 para octal y un 0x para hexadecimal. 	Incluye un punto decimal.

	

	Ya que esto  puede resultar un poco lioso pondremos un ejemplo:
	
	ej.	
	#Pasamos a hexadecimal
	% format "%#x" 20 
     	0x14 
	
	No pretendo explicar  todos los modificadores asi que investigar un poco.

	4.3. SCAN

	
Quien no ha utilizado un scan cuando ha programado en c (scanf) o en otro lenguaje? tcl tambien tiene este comando muy parecido al de c, guarda el resultado en una variable eligiendo el formato deseado (utilizar las tablas del apartado anteriror).
La sintaxis de este comando seria algo asi --> scan string el_formato 	valor1 valor2 valorquetecuen...
No os creais que esta funcion espera que nosotros introduzcamos un valor, NO!!
Donde pone string escribimos la cadena de caracteres que queremos guardar en la variable; y pensareis por que no utilizamos el comando set, pues por la sencilla razon que con scan podemos elegir el formato que queramos.
	
	Aki va un ejemplo:

	ej.
	#escribimos la cadena de caracteres abcdefghijklmn en la varible abece con formato string 
	 #con una longitud de 10. Por lo tanto solo escribira abcdefghij
	%  scan "abcdefghijklmn" "%10s" abece 
	1  ---> si se graba correctamente devuelve el valor 1 (creo que es asi)
	% set abece
	abcdefghij
	
Sobre el manejo de string podemos explicar muchas mas cosas. Como el comando  string match. este comando sirve para comparar string con un patron dado pero en mi opinion no lo veo interesante y se desvia un poco de lo que queria que fuera este curso, una introduccion basica (estoy hablando como una persona mayor xDD).


5. SINTAXIS III (Controles de flujo)


En este apartado vamos a explicar uno por un los controles de flujo, si si, hablo del while y el if y todo eso que supongo que si habeis programado alguna vez en cualquier otro lenguaje os sonara.

	5.1. IF,THEN,ELSE


Este comando expresa una condicion if(si) ocurre algo then(entonces) realiza la accion else(sino se se cumple el if) realiza otra accion. Esta explicacion es muy muy por encima pero espero que quede entendido.  La estructura seria algo asi if condicion then accion  else accion1. Por cierto then es opcional no hay por que ponerlo. 
	
	ej.
	 % if { $opcion == 1 } { 
    	 %puts "la opcion es igual a 1"
   	 %} else { puts "la opcion es distinta a 1"
     	 %} 

Fijaos bien en la utilizacion de las llaves, abrimos llaves para escribir 	la condicion y cerramos  al terminarla, tambien abrimos llave a lescribir la accion y al terminarla, lo mismo pasa con la accion del else.
Tambien podemos utilizar el comando elseif, para entrelazar condiciones algo asi...

	ej.
	 % if { $opcion == 1 } { 
    	 %puts "1"
   	 %} elseif   { $opcion == 2 } {
     	 %puts "2" 
	 %} elseif  { $opcion == 3 } {
	 % ...... 
	#y asi hasta el infinito y mas alla!!!....


	5.2  SWITCH


Este comando funciona de una manera muy parecida al case de c u otros lenguajes (yo siempre comparo con c por que es el que mas conozco y uso y no por otra razon). Funciona comparando un valor con con distintas variables. os imaginais si tuvieramos que hacerlo a base de if?, engordaria un poco el codigo no?

Las sintaxis del switch seria algo asi :

switch modificadores  variable { valor1 accion1 valor2 accion2 ...}

Por lo tanto compararia la variable con los distintos valores, si coinciden realiza una accion.
Veamos un ejemplo:


   %switch -exact -- $variable { 
    1 {puts "wuan"} 
    2 {puts "chu" } 
    3 {puts "zri"} 
    default {puts "Ninguno"} 
    } 


 Bueno como veis si al variable vale 1 escribira uno en ingles( podeis coger un diccionario y comprobarlo) y si vale 2 pues escribira dos en ingles y asi mas.

Tambien se pueden incluir unos modificadores, aki os lo pongo:


	-exact, compara de forma exacta el valor con la variable. 

	 -glob, usa el estilo glob. 

	 -regexp, usa el estilo de las expresiones regulares 

	 --, Sin flags o fin de los flags	


	5.3 FOR

El comando for es muy parecido al de c/c++ , repite una accion un numero determinado de veces cumpliendo una condicion.
Aki va la sintaxis --->  for {inicializacion de la variable} {condicion} {el incremento}  .. instruccion


	&for {set i 0} {$i < 10} {incr i 3} { 
     	set variable [expr variable+1] 
   	  } 

Como veis inicializa la varaible i a 0, luego dice que la instruccion se hara solo si i es menor que 10 y incrementara a i 3. 
Cuando pasa la condicion realiza la accion de la segunda linea, que sumara 1 a la variable  variable (xD). Fijaos bien en que al realizar el incremento se utiliza el comando incr luego se pone la variable y a continuacion el incremento

	5.4 FOREACH

Foreach pemite recorrer una lista sin conocer el numero de componentes de esta, lo inclui en esta seccion por que es un control de flujo en toda regla pero no  lo explicaremos en el siguiente numero ya que no hemos mencionados listas ni estructuras de datos.


	5.5. WHILE  

El comando while, que en ingles significa "mientras", realiza una accion mientras se cumpla una condicion, su funcionamiento es parecido al de c/c++ (me repito.. xD).
La sintaxis -->   while  {condicion}   {... instruccion

	5.6. BREAK, CONTINUE, RETURN



BREAK
Vamos, que este comando sirve unicamente pa romper el bucle, sea un for o un while o.. vamos un bucle.

CONTINUE
Este comando sirve para saltarse una vuelta del bucle, vamos, que si por ejemplo hacemos un while que mentras que x sea menor que 10 
sume un  numero a una variablem, pero incluimos un if que diga que si es una letra pues salte esa vuelta y regrese al principio del bucle y no sumando a si la letra a la variable. ok?

RETURN
Cuando se completa un procedimiento (tipo while, for...) devuelve el resultado de la ultima operacion realizada, en cambio si ponemos:  return 1 devolvera 1.


	5.7. CATCH

El comando catch sirve para capturar los errores que se recogen durante un procedimiento, tambien para capturar el valor devuelto en un procedimiento. Capturar errores servira para que el procedimiento no rompa cuando ocurre uno.
La sintaxis -->  catch instruccion  resultado

La instruccion  es el procedimiento del que queremos capturar el error o un valor. El resultado sera el valor devuelto, 0 si no hubo error y 1 si lo hubo.


	5.8. CASE

Su utilizacion es muy parecida a la del switch pero ley en un manual que se considera obsoleta y no se asegura que se mantenga en siguientes funciones, vamos que esta acabada. 



 Bueno aki termina la primera entrega de esta serie de articulos de programacion en  tcl, si teneis alguna duda sobre el articulo, algo que no entendais, criticas, elogios, dinero, lo que sea escribir a ajx@eresmas.com... vuestras dudas seran incluidas en un apartado final y resueltas, 
evidentemente.  
Se despide ajX, espero que os haya  gustado y  servido para algo, nos veremos en la proxima entrega, byez_


By ajX








