« Tcl: Iterazioni: comando forAppunti di Tcl/TkTcl: Iterazioni: una implementazione Tcl del comando do »

Tcl

Iterazioni

comandi continue e break

Questo ciclo che conta da 1 a 9, escludendo però il numero 5 illustra l'uso di continue(n):

% for {set i 1} {$i<10} {incr i} {
    if $i==5 continue
    puts $i
}
1
2
3
4
6
7
8
9

Quando l'interprete figlio che esegue il body incontra il comando continue(n) all'interno del corpo, l'esecuzione del corpo termina e riprende l'esecuzione del ciclo che contiene il corpo interrotto, con la rivalutazione della sua condizione se si tratta di un ciclo while, o con la rivalutazione della istruzione next e poi della condizione se si tratta di un ciclo for. In entrambi i casi è come se si saltasse alla fine del corpo del ciclo, ossia l'effetto è di non eseguire il resto del codice all'interno del body.

Questo programma può essere anche riscritto invertendo la condizione dell'if:

for {set i 1} {$i<10} {incr i} {
    if $i!=5 {puts $i}
}

Il comando continue(n) quindi non è strettamente necessario alle computazioni. Esiste solo perché in alcuni casi risulta più chiaro di un if con condizione inversa ed evita un ulteriore livello di nesting dei comandi.

Il comando break(n) invece causa la terminazione immediata del ciclo while o for e può trovarsi nel body oppure nel next. L'esecuzione viene ripresa dall'interprete con la prossima linea di codice dopo il comando di ciclo. Anche questo comando non è strettamente necessario, ma è stato introdotto per rendere maggiormente leggibili alcuni cicli, semplificando la condizione di terminazione. Un esempio classico consiste nella ricerca lineare di un valore x in un array a di n elementi, indicizzato numericamente a partire da 0. Confrontate le due versioni equivalenti, con e senza break:

# linear search (with break)
for {set i 0} {$i<$n} {incr i} {
  if $a($i)==$x break
}
if $i<$n {
  # found at index $i
} else {
  # not found
}
# linear search (without break)
for {set i 0} {$i<$n && $a($i)!=$x} {incr i} {}
if $i<$n {
  # found at index $i
} else {
  # not found
}

Notate che {} o "" è la stringa di comando nulla, che corrisponde all'istruzione nulla che in C si indica col terminatore delle istruzioni ; (punto e virgola).

Non occorre tuttavia implementare la ricerca lineare. Il modo idiomatico per esprimere una ricerca lineare in Tcl verrà introdotto parlando del comando array.

« Tcl: Iterazioni: comando forAppunti di Tcl/TkTcl: Iterazioni: una implementazione Tcl del comando do »