« Tcl: Esecuzione dei programmi Tcl (in UNIX)Appunti di Tcl/TkTcl: Sostituzione e valutazione »

Tcl

Variabili

In Tcl, le variabili si creano e assegnano tramite il comando set(n), che funziona un po' come l'operatore di assegnamento in altri linguaggi:

% set x 1
1

Il comando precedente crea la variabile scalare x e vi assegna il valore 1. Restituisce il nuovo valore della variabile assegnata e se il comando viene dato interattivamente, la shell tclsh(1) stampa questo valore.

Non vi è nessuna specificazione di tipo, perché Tcl ha un solo tipo di dati primitivo predefinito: le stringhe. Al contrario il linguaggio C ha quattro tipi di dati fondamentali (int, float, double, char) e in C le stringhe sono tipi strutturati e non primitivi (una stringa C è un array di caratteri).

Questo non implica che Tcl non è in grado di fare elaborazioni numeriche (calcoli o confronti tra numeri). Quello che succede è che le stringhe vengono convertite in numeri quando necessario, ma l'interprete memorizza internamente ogni variabile sotto forma di stringa. Questo non rende Tcl un linguaggio efficiente per il calcolo numerico. Se dovete fare calcoli numerici complicati, meglio ricorrere a linguaggi compilabili in modo molto efficiente, come il C/C++, oppure estendere Tcl con nuovi comandi ad hoc scritti in C.

Notate che se non viene specificato un nuovo valore, ovvero set(n) viene invocato con un solo argomento anziché due, set(n) ritorna il valore corrente della variabile senza modificarlo:

% set x
1

Tuttavia in generale meglio usare $x che verrà sostituito con il valore della variabile ed è una notazione più sintetica. L'uso di set per ottenere il valore di una variabile è utile per deferenziare un puntatore letterale, ovvero ottenere il valore di una variabile il cui nome è contenuto in un'altra variabile:

% set y 5
5
% set x y
y
% set $x
5

La creazione delle variabili avviene automaticamente la prima volta che si assegna un valore. Il valore può essere poi cambiato tramite un'altra assegnazione:

% set x stringa
stringa

In linguaggio C per riferirsi al valore di una variabile se ne usa il nome, mentre per riferirsi al suo indirizzo si premette il carattere & al nome. In Tcl la convenzione è diversa: il nome della variabile rappresenta un riferimento alla variabile e sostituisce il suo indirizzo numerico che viene deciso dall'interprete, mentre se il nome viene fatto precedere da $ si ottiene il valore della variabile con quel nome.

% set y "due parole"
due parole
% set x $y
due parole

Nella seconda istruzione set il valore della variabile y viene assegnato alla variabile x. Il primo argomento del comando set deve sempre essere un riferimento alla variabile da assegnare. Perché? I comandi in Tcl rappresentano delle subroutine, l'analogo delle funzioni in C. Quando un comando deve modificare il contenuto della variabile passata (e set in effetti ha bisogno di modificarla), questa deve essere passata per riferimento, ossia deve essere passato l'indirizzo della locazione di memoria in cui risiede la variabile, che in Tcl abbiamo detto si indica in modo mnemonico semplicemente attraverso il nome della variabile. Il passaggio per valore infatti non consente di cambiare il contenuto della variabile passata, in quanto se ne riceve solo il valore; questo valore viene copiato in una variabile parametro locale alla procedura, la quale può anche essere modificata, ma i cambiamenti non si riflettono sulla variabile passata. I comandi predefiniti non hanno niente di speciale o diverso e per uniformità seguono le stesse regole per quanto riguarda il passaggio di parametri di quelli che potete definire voi stessi estendendo Tcl (vedremo in seguito come fare per definire nuove procedure).

Anche il comando puts accetta variabili passate per valore come argomento e questo serve appunto per stampare il valore di una variabile:

% set PI 3.14159
3.14159
% puts $PI
3.14159
% puts "PI=$PI"
PI=3.14159

Se il nome di una variabile contiene solo caratteri alfanumerici, ossia è del tipo varName, allora il tipo è scalare. Se invece il nome contiene una parentesi aperta e termina con una parentesi chiusa, ossia è del tipo varName(index), allora la variabile si riferisce all'elemento di un array di nome varName e i caratteri tra parentesi rappresentano il valore indice all'interno dell'array. I valori indice sono delle stringhe, l'unico tipo di dato primitivo in Tcl, quindi Tcl ha incorporati nel linguaggio gli array associativi (come perl(1) o awk(1)) o meglio tutti gli array in Tcl sono associativi. Gli array sono un tipo di dati strutturato e verranno trattati meglio in seguito, intanto ecco degli esempi di assegnazione ad elementi di un array e lettura di elementi da un array:

% set a(1) 5
5
% set a(2) "cinque"
cinque
% puts $a(1)
5
% set page(url) http://www.tcl.tk
http://www.tcl.tk
% set page(size) 10034
10034

« Tcl: Esecuzione dei programmi Tcl (in UNIX)Appunti di Tcl/TkTcl: Sostituzione e valutazione »