page 2

les variables en tcl

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 :

A) 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"
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 iletaitunebergere ; # La variable b reçoit la chaîne "iletaitunebergere"
puts $a ; # Affichage de la valeur de a Résultat : b
puts $b ; # Affichage de la valeur de b Résultat : iletaitunebergere
puts [subst $$a] ; # Affichage de la valeur de la variable contenue dans la variable a, Résultat : 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
Résultat : 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 Résultat : il etait une bergere
set toto {il etait une $a} puts $toto Résultat : il etait une $a

Les guillemets permettent l'utilisation de caractères blancs (espaces) 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
Résultat : 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
Résultat : 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"
Résultat : un train peut en cacher un autre

B) 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
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 {etait une bergere}} ; # liste contenant deux éléments
puts $toto
Résultat : il {etait une bergere}
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 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 à partir de) l'ensemble des éléments d'une liste:

set maliste "Il etait une bergere"
foreach mot $maliste {
puts $mot
}

Résultat : 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

 

 C) les nombres entiers et les nombres 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
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

 ATTENTION : 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.

D) les tableaux

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

ATTENTION : 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

 

 

PAGE 1(sommaire) - PAGE 3 (les boucles) 

Fabien, le 18 mai 2025 à 09:59

Avec plaisir !


CrazyCat, le 13 mai 2025 à 12:20

Bonjour,

Je trouve ton explication sur les variables très pédagogique, puis-je avoir l'autorisation d'en reprendre une grosse partie pour mettre sur https://wiki.eggdrop.fr (en citant bien entendu l'auteur initial et le site source) ?

Merci d'avance