Introduction rapide à TCL

1) Présentation:

Ces quelques pages d'aide sont écrites à l'intention de ceux qui ne connaissent pas TCL et qui voudraient pouvoir modifier ou réécrire complètement le fichier script TCL de l'interprétation ou le fichier script TCL du calcul de l'Ayanamsa.
La connaissance d'un langage de programmation est fortement conseillée.

TCL est un langage créé par John K. Ousterhout, docteur de l'université de Berkeley, en Californie.
TCL possède deux aspects positifs principaux:

pour le programmeur, TCL permet, à l'intérieur du code en C ou C++, de lancer l'exécution d'un interpréteur TCL qui exécutera un fichier script contenant des instructions modifiables par l'utilisateur.
De plus, il est possible d'ajouter des commandes personnalisées à cet interpréteur et ainsi de fournir une interface entre les données internes du programme et le script TCL.
Il est également possible de communiquer entre l'extérieur (le fichier script) et le programme (par exemple récupérer dans le programme une valeur calculée par un script TCL).

pour l'utilisateur final, l'existence, pour une application, de certaines portions écrites sous forme de script TCL garanti la possibilité de modifier ces parties et donc de paramétrer l'exécution du code selon ses besoins (au prix d'un peu de programmation).

Il faut aussi noter que TCL est portable sous Unix.
Vous trouverez sur le web de nombreux sites consacrés à TCL-TK.

2) Ecrire un script TCL

Remarque:

Pour se familiariser avec TCL, il est conseillé de lancer tclsh et de saisir les exemples fournis ci-dessous.

a) Les variables

1) #

Pour mettre une ligne en commentaire, la faire précéder de #

Exemple:

# ceci est une ligne de commentaires
set x 0 ; # commentaire en fin de ligne

la ligne ci dessus est constituée de deux instructions

set x 0 et # commentaire en fin de ligne

for {set i 0} \
{$i < 10} \
{incr i} \
{put $i}

illustre l'utilisation de \ pour écrire sur plusieurs lignes une instruction qui en principe doit tenir sur une seule ligne.

2) set

l'affectation des variables se fait avec l'instruction set.
set sert aussi à déclarer une variable

# Exemple
set a 12.6
# déclare un variable appelée a et lui affecte la valeur 12.6

pour accéder à la valeur d'une variable, il faut la faire précéder du signe $
dans l'exemple précédent, la valeur de a est 12.6 et sera obtenue par l'expression $a.

# Exemple
# déclare une variable de nom a et lui affecte la valeur 44
set a 44
# déclare une variable de nom b et lui affecte la valeur de a
set b $a
# ici a et b ont pour valeur 44

3) expr

expr permet d'obtenir la valeur résultat d'une expression.

# exemple
set x 4
set y [expr $x + 10]
# x a pour valeur 4 et y a pour valeur 14

Les crochets indiquent à l'interpréteur TCL qu'il doit traiter expr $x + 10 comme un script indépendant. Le résultat de expr $x + 10 est la valeur 14 donc on affecte à y la valeur 14.

4) incr
ajoute une valeur à une variable

# exemple
set x 10
incr x
# ici x vaut 11, car incr sans argument équivaut à incr 1
incr x 2
# ici x vaut 13 car on a ajouté 2 à 11

5) eval

permet d'évaluer l'expression qui suit entre { } comme un script TCL

# exemple
eval { set x 2}
# x vaudra alors 2

b) les instructions de contrôle

1) if

#exemple
if {$x > 0} {
set b 1
}

dans ce cas, si x a pour valeur quelque chose de strictement positif, b prend la valeur 1.
Voilà un exemple avec un else:

if { $c > 2} {
set d 4
} else {
set e 15
}

Remarque importante :

Les accolades ouvrantes ne doivent pas commencer une nouvelle ligne, mais doivent se trouver sur la même ligne que le mot auquel elles se rapportent. Par exemple,

if {$x>0}
{
set y 2
}

n'est pas correct car l'interpréteur TCL attend deux arguments minimum pour if et ici n'en trouvera qu'un, à savoir {$x>0}

pour que l'exemple ci-dessus soit valide, il faut écrire

if {$x>0} {
set y 2
}

ou bien

if {$x>0} \
{ \
set y 2 \
}

2) while

set i 10
set y 0
while {$i > 0} {
set y [ expr $y + $i]
incr i -1
}

à la sortie de la boucle, y vaut 55 ( 55 = 10 + 9 + 8 + 7 +..+ 1)

3) for

set y 0
for {set i 0} {$i<15} {incr i} {
incr y
}

à la sortie de la boucle, y vaut 15.
La première expression est l'initialisation de la boucle for, exécutée une seule fois.
La seconde expression est la condition d'arrêt de la boucle for, évaluée à chaque passage dans la boucle.
La troisième expression est l'action entreprise à la fin de chaque exécution de la boucle.
La quatrième est l'ensemble des instructions exécutées à chaque passage dans la boucle.
Le comportement du for de TCL est identique à celui du for du langage C.

4) foreach

foreach {i} { 0 1 2 3 } {
set myarray($i) 5
}

ici foreach exécute l'instruction

set myarray($i) 5

quatre fois avec pour i les valeurs successives 0, 1, 2 et 3
l'instruction set myarray(0) créé, si nécessaire, un tableau appelé myarray, et ajoute à ce tableau un élément appelé 0 qui a pour valeur 5.
On fait la même chose pour 1, 2, et 3.
Pour accéder par exemple, à la valeur du second élément du tableau, on écrira

$myarray(1)

remarque : on peut utiliser break ou continue comme en C pour sortir d'une boucle ou continuer la boucle à la prochaine itération.

set a {un deux trois quatre cinq}
foreach i $a {
put $i
if {$i == "quatre"} break
}

affichera

un
deux
trois
quatre

remarquez la manière dont le foreach est écrit, mettant bien en lumière que le deuxième mot ( ou argument ) est une liste.

5) switch

set a 0
set b 0
set c 0
set d 1
switch $d {
0 {incr a}
1 {incr b}
2 {incr c}
}

à la fin de l'évaluation, a vaut 0, b vaut 1 c vaut 0 et d vaut 1.
Par rapport au langage C, on peut remarquer que incr c, n'est pas exécuté, bien qu'il n'y ait pas de break après incr b.
Comme toujours, la position des accolades est importante.

c) procédures

une procédure en TCL est analogue à une fonction en C

proc multipli {a b} {
if {$a==0} {return 0}
if {$b==0} {return 0}
expr $a*$b
# ou alors
# return [ expr $a*$b ]
}

ici le nom de la procédure est multipli, elle prend deux arguments a et b
on utilisera la procédure comme ceci

.
.
set x [ multipli 15 10 ]
.
.
x vaudra alors 150

On remarque que si a ou b valent zéro, on retourne tout de suite la valeur zéro.
Sinon, la procédure retourne la valeur de retour de la dernière instruction exécutée, ici expr $a*$b
On peut aussi avoir un return explicite comme dernière instruction.

Remarques :

- les variables déclarées à l'intérieur d'une procédure sont locales à cette procédure.
- pour accéder à des variables globales dans une procédure, utilisez le mot clé global

proc incry x {
global y
incr y $x
}

set y 10
incry 100
put $y

affichera 110
y vaut alors 110

Voir aussi:

Bibliographie