En Tcl, les variables sont non typées, et peuvent être, suivant le cas, considérées comme chaînes de caractères (le cas le plus large), listes (ensemble ordonné d'éléments non typés qui peuvent aussi être eux mêmes des listes), entiers ou flottants. Elles peuvent aussi être des tableaux à une ou plusieurs dimensions. Une même variable peut être considérée de types différents suivant l'opération que l'on fait sur elle.
Voici 4 types de varialbes expliquées :
Les variables simples
L'accès à une variable nom_variable se fait par $nom_variable. L'affectation se fait par la commande set.
Par exemple :
% set a 12 #la variable a reçoit "12" % puts a #affichage du caractère "a" a % puts $a #affichage du contenu de la variable a 12 % set a b #la variable a reçoit la lettre "b" % set b iletaitunebergere #la variable b reçoit la chaîne "iletaitunebergere" % puts $a #affichage de la valeur de a b % puts $b #affichage de la valeur de b iletaitunebergere % puts [subst $$a] #affichage de la valeur de la variable contenue dans la variable a, iletaitunebergere #la fonction subst force l'évaluation le plus loin possible des #variables. L'emploie des crochets sera expliqué plus loin
Il existe de Chaînes de caractères pouvant contenir des espaces:
% set toto il etait une bergere #utilisation de la fonction set avec trop d'arguments wrong # args: should be "set varName ?newValue?" % set toto "il etait une bergere" #utilisation correcte de set % set toto {il etait une bergere} #autre utilisation correcte de set % set a bergere % set toto "il etait une $a" % puts $toto il etait une bergere % set toto {il etait une $a} % puts $toto il etait une $a
Les guillemets permettent l'utilisation de caractères blancs dans une chaîne, les accolades aussi, mais celles-ci interdisent l'évaluation des variables éventuelles contenues
dans la chaîne.
Il est aussi possible d'utiliser des espaces dans une chaîne de caractères en les faisant précéder d'un anti-slash. Celui-ci permet de considérer le caractère qui le suit comme un
caractère normal.
% set toto il\ etait\ une\ $a % puts $toto il etait une bergere
Ainsi si une chaîne de caractères doit contenir des guillemets ou des accolades:
% set toto \{il\ etait\"\ une\nbergere # \n force un retour chariot % puts $toto {il etait" une bergere
Remarque: la concaténation de chaînes peut se faire de manière automatique:
% set Aut "un aut" % set Re re % set toto "un train peut en cacher $Aut$Re" un train peut en cacher un autre
Les listes
Tcl/Tk permet de tout considérer comme une liste, par exemple:
set toto "il etait une bergere" llength $toto #fonction retournant le nombre d'éléments de la #liste en argument
le résultat de ce code est : 4
Il est possible de construire explicitement des listes par l'utilisation du constructeur list ou par
l'utilisation d'accolades:
% set toto {il {etait une bergere}} #liste contenant deux éléments % puts $toto il {etait une bergere} % llength $toto #nombre d'éléments de la liste 2 % llength [lindex $toto 1] #nombre d'éléments du deuxième élément de la #liste: celles-ci sont indexées à partir de 0 3 % set toto [list il [list etait une bergere]] #donne le même résultat qu'en utilisant les #accolades. Cependant, permet l'utilisation #de variables dans la fabrication de la liste, # ce que les accolades empêchent.
La fonction la plus intéressante pour le parcours de liste est foreach, qui permet 'd'effectuer un ensemble de commandes sur (ou a partir de) l'ensemble des éléments d'une liste:
%set maliste "Il etait une bergere" %foreach mot $maliste { puts $mot } Il etait une bergere
La propriété intéressante de foreach est qu'elle permet de traiter les éléments de l'ensemble par couple, triplet, etc...
%foreach {motimpair motpair} $maliste { puts $motpair #seul un mot sur deux est affiché } etait bergere
Les entiers et les flottants
Comme Tcl/Tk considère que tout est chaîne de caractères, il est nécessaire de lui spécifier qu'une opération arithmétique est désirée:
% set a 23+12 23+12 % set a [expr 23+12] 35 #utilisation de la fonction expr pour des calculs arithmétiques
La différence entre entiers et flottants se fait de manière implicite suivant le type des opérandes:
% expr 23/3 7 % expr 23.0/3 7.66667 #calcul entier car les deux arguments sont des entiers #un des arguments est un réel => calcul flottant
Les tableaux
Les tableaux sont des variables possédant des entrées:
% set tableau(oncle) Tom % puts $tableau(oncle) Tom % set i oncle % puts $tableau($i) #l'entrée oncle du tableau reçoit la chaîne "Tom" #référence au contenu d'une variable de type tableau #encore une référence, mais cette fois ci par une #variable
On peut aussi créer des tableaux à plusieurs dimensions, dans ce cas les noms d’entrées sont séparés par des virgules :
% set tab2(case,enpaille) oncle % puts $tableau($tab2(case,enpaille)) #l'entrée référencée par case et enpaille reçoit #"oncle" #affichage de l'entrée oncle de tableau Tom
Limitation: une variable de type tableau ne peut pas être créée dans une variable autre et vice-versa:
% set toto 12 #toto est donc connu par l'interpréteur comme une variable chaîne % set toto(a) 10 #assignation incorrecte can't set "toto(a)": variable isn't array % unset toto #le contenu de la variable est libéré, de plus la variable toto est "oubliée" % set toto(a) 10 #assignation maintenant correcte car toto est une nouvelle variable