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 variables expliquées :
L'accès à une variable nom_variable se fait par $nom_variable. L'affectation se fait par la commande lset.
Par exemple :
set a 12 ; # La variable a reçoit "12" puts a ; # Affichage du caractère "a" résultat : a puts $a ; # Affichage du contenu de la variable a résultat : 12 set a b ; # La variable a reçoit la lettre "b" set b ilétaitunebergère ; # La variable b reçoit la chaîne "ilétaitunebergère" puts $a ; # Affichage de la valeur de a Résultat : b puts $b ; # Affichage de la valeur de b Résultat : ilétaitunebergère puts [subst $$a] ; # Affichage de la valeur de la variable contenue dans la variable a, Résultat : ilétaitunebergère
Il existe des chaînes de caractères pouvant contenir des espaces:
set toto il était une bergère ; # utilisation de la fonction set avec trop d'arguments #Résultat : wrong # args: should be "set varName ?newValue?" set toto "il était une bergère" ; # utilisation correcte de set set toto {il était une bergère} ; # autre utilisation correcte de set set a bergère set toto "il était une $a" puts $toto #Résultat : il était une bergère set toto {il était une $a} puts $toto #Résultat : il était une $a
Les guillemets permettent l'utilisation de caractères blancs (espaces) dans une chaîne, les accolades aussi, mais elle 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\ était\ une\ $a puts $toto #Résultat : il était une bergère
Ainsi si une chaîne de caractères doit contenir des guillemets ou des accolades :
set toto {il\ était\"\ une\nbergère # \n } ; # force un retour chariot puts $toto # Résultat : il était" une bergère
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" #Résultat : un train peut en cacher un autre
Tcl permet de tout considérer comme une liste, par exemple:
set toto "il était une bergère" llength $toto #fonction retournant le nombre d'éléments de la liste en argument #Résultat : 4
Il est possible de construire explicitement des listes par l'utilisation du constructeur list ou par l'utilisation d'accolades:
set toto {il {était une bergère}} ; # liste contenant deux éléments puts $toto #Résultat : il {était une bergère} llength $toto ; # nombre d'éléments de la liste #Résultat : 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 #Résultat : 3 set toto [list il [list était une bergère]] ; # 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 à partir de) l'ensemble des éléments d'une liste
set maliste "Il était une bergère" foreach mot $maliste { puts $mot } #Résultat : Il était une bergère
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é } était bergère
Comme Tcl 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 #Résultat : 23+12 set a [expr 23+12] ; # utilisation de la fonction expr pour des calculs arithmétiques Résultat : 35
La différence entre entiers et flottants se fait de manière implicite suivant le type des opérandes. Le fait d'ajouter une décimale indique à l'interpréteur que le nombre est un flottant. Les deux exemples ci-dessous sont très explicite :
expr 23/3 ; # calcul entier car les deux arguments sont des entiers #Résultat : 7 expr 23.0/3 ; # un des arguments est un réel => calcul flottant #Résultat : 7.66667
la virgule décimale est un point car elle utilise la notation Anglaise. Si vous effectuez un calcul avec une virgule, l'interpréteur vous renverra une erreur.
Les tableaux sont des variables possédant des entrées:
set tableau(oncle) Tom puts $tableau(oncle) #Résultat: 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
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 #Résultat : 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
Intégralement repris depuis tcltk.fr avec l'aimable autorisation de Fabien