Programmation Tcl/Notation particulière de Tcl

Un livre de Wikilivres.

Tcl utilise une notation particulière pour indiquer les appels de fonctions.

En mathématique, ainsi que dans la plupart des langages de programmation, on utilise la notation y = f(a,b).

Tcl a magnifiquement simplifié cette notation en mettant les parenthèses AVANT la fonction :

set y [f a b]

Autrement dit, en mathématique, on écrirait y = (f a b) c'est lumineux, car on comprend où commence la fonction (par le crochet "[") et où elle finit (par "]"). Les virgules ont également disparu ... S'il y a des appels de fonctions imbriquées, les parenthèses doivent être imbriqués, par exemple set z [g x [f a b]] ... en math z=g(x,f(a,b)) Cette notation se rapproche évidemment de la notation utilisée dans les langages de scripts sh, csh, etc. mais là on écrit y = `f a b` avec des ` (accent grave) qui ne sont pas des parenthèses (ouvrantes et fermantes).


Dans tout langage de programmation, il faut toujours faire la distinction entre la référence à la variable et le contenu de la variable. Lorsque l'on utilise une variable, disons X, le fait que l'on parle de sa référence (ou son adresse) ou de son contenu dépend généralement de sa place dans l'instruction du langage de programmation. Ainsi en C on écrit X=Y ce qui signifie qu'on affecte à la variable X (on ne s'occupe pas de sa valeur) le contenu de la variable Y. X situé à gauche du signe "=" est traité différemment de Y qui est à droite du signe "=" (on ne s'intéresse qu'à sa valeur). En Tcl, (mis à part les raccourcis d'écriture décrits ci-dessous) c'est beaucoup plus logique ... Il existe la fonction set :

[set X] est la fonction qui rend le contenu de la variable X

set X 25 permet d'affecter à X la valeur 25

[set X 25] , par extension fait les deux, elle affecte 25 à X et rend la valeur de X, c'est-à-dire 25

ainsi x=y s'écrit set X [set Y]

c'est logique ... mais un peu lourd. En Tcl on utilise le raccourci d'écriture $Y à la place de [set Y], set X [set Y] s'écrit alors set X $Y

On utilise presque toujours $Y au lieu de [set Y] sauf quand il y a ambiguïté. On utilise aussi la notation ${VARIAB} à la place de $VARIAB (ou canoniquement [set VARIAB]) si ambiguïté.


Pourquoi tout cela ? ... Pour pouvoir concaténer des chaînes de caractères de la manière la plus naturelle possible, en les juxtaposant. Par exemple :

set Titre "Monsieur"
set Prenom "Jean"
set Nom "Martin"
set Texte "$Titre $Prenom $Nom est l'heureux gagnant ..."

Dans cet exemple les mots sont bien séparés par des espaces

Prenons un exemple sans espaces

set Rep "/usr/local/"
set Fichier "$RepToto.txt"

ne marche pas parce il semble qu'il y ait une variable de nom RepToto alors que ce qu'on voulait c'est (canoniquement)

set Fichier "[set Rep]Toto.txt"

ou (en raccourci sans ambiguïté),

set Fichier "${Rep}Toto.txt

pour bien faire la distinction entre la variable $Rep et le texte Toto.txt


Pour finir ces histoires de notation ... un appel à une fonction se fait par

set x [f $a $b]

si l'on veut transmettre à f le contenu de a et b

ou

set z [h $a b]

si l'on veut transmettre à h la valeur de a et la référence (ou adresse) de la variable b (pour que h la modifie, par exemple)

on aurait dû écrire, canoniquement

 set z [h [set a] b]