Bucles en TCL
SOLUCIONARIO
Bucles en TCL
2025-05-05
Por
Occam's Razor

#!/usr/bin/tclsh

array set a {}

for {set i 0} {$i < 10} {incr i} {
    set a($i) [expr {$i + 10}] 
}

set i 0
while {$i < 10} {
    puts "$i -> $a($i)"
    incr i
}
puts "----------------------------"

while { $i > 0} {
    incr i -1
    puts -nonewline "$i -> $a($i)"
    if {$i > 4} {
      puts ""
      continue
    }
    puts " **"
    if {$i == 1} {break} 
}
puts "----------------------------"

foreach {k v}  [lsort [array get a]] {
     puts -nonewline "$k "
}

foreach  k  [lsort [array names a]] {
    puts -nonewline "$a($k) "
}
puts ""

TCL también nos ofrece una modesta selección de elementos para construir nuestros bucles, permitiéndonos construir bucles for y while y controlar su ejecución con continue y break de la misma forma que en el resto de lenguajes que ya hemos visto.

Los bucles for, como es habitual, ofrecen una forma compacta de los bucles while, permitiéndonos inicializar, indicar la condición de finalización del bucle y la forma de avanzar la iteración en una sola línea:

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

Como podéis ver para incrementar la variable podemos utilizar incr.

SABIAS QUE

incr es una instrucción TCL que nos permite incrementar una variable, cuando la utilizamos con un solo parámetro, ese parámetro debe ser la variable, y esta se incrementará en 1. Podemosm usar un segundo parámetro con el que indicar la cantidad en la que queremos incrementar la variable. Finalmente, podemos indicar el incremento con otra variable, por ejemplo:

  incr foo $bar

Incrementará la variable foo el valor contenido en la variable bar.

incr es muy útil puesto que de lo contrario tendríamos que escribir algo como esto:

  incr foo
  # Es equivalente a 
  set foo [expr {$foo + 1}]

TCL también nos permite iterar sobre arrays de forma sencilla utilizando la palabra clave foreach, la cual puede iterar sobre las claves del array o sobre las claves y sus valores, dependiendo de la operación que utilicemos para acceder al array: get o names.

foreach permite iterar listas. De hecho nos permite iterar más de una lista a la vez y extraer más de una valor en cada iteración. Por ejemplo:

for each i {a b c} {j k} {m n o p q r} {
  puts "$i -> $j, $j"
}

Mostrará la siguiente salida:

a - m, n
b - o, p
c - q, r

La variable i se utiliza para iterare la primera lista {a b c}, y las variables j y k se utilizan para iterar la segunda lista {m n o p q r}. Como podéis ver, en la segunda lista, las variables j y k van tomando valores consecutivos de la lista. Podríamos añadir más listas o más variables en cada lista. Como podéis ver foreach es una instrucción muy potente.

SABIAS QUE

TCL trata los arrays internamente como tablas hash, por esa razón hablamos de claves y valores. Esta es también la razón por la que los valores se devuelven en un orden aleatorio cuando recorremos el array. En el ejemplo podéis ver como usamos lsort para ordenar los valores por clave que sería equivalente a mostrar el array usando los índices de cada elemento.

Podemos crear bucles infinitos en TCL usando cualquiera de las siguientes formas:

while (1) {
  # Bucle
}
  
for {} {1} {} {
  # Bucle
}

Al igual que sucede con Bash, TCL trabaja sobre cadenas de caracteres y es por ello que no podemos realizar operaciones aritméticas directamente sobre nuestras variables. Estas operaciones las podemos realizar con el comando expr.

Resumen

  • TCL ofrece bucles for, while y foreach
  • TCL ofrece las palabras claves break y continue para controlar el flujo de os bucles.

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)