"Comment j'ai divisé par 10 le nombre de lignes de code de mes programmes !"
"Auteur de la version initiale : Arnaud LAPREVOTE"
Introduction.
Pourquoi un cours sur le tcl/tk ?
Je me présente, je m'appelle Henri. Euh non, Arnaud LAPREVOTE.
Il était une fois un programmeur qui avait passé des milliers d'heures à programmer en C, particulièrement des applications de calculs scientifiques (traitement vidéo). Avec les années, il avait acquis une grande facilité dans l'écriture des programmes C, et en même temps une certaine impatience.
Autant le C le satisfaisait pour le calcul scientifique, autant dès qu'il fallait traiter des fichiers ou des chaînes de caractères, il trouvait que c'était fastidieux et surtout générateur d'erreurs de manière inacceptable.
Comme tout le monde, il avait entendu parler des langages de script genre Perl, tcl/tk, et autres (python).
À l'occasion de l'installation de son PC sous Linux, il prit le temps de commencer à programmer en tcl.
Et ce fut un choc. Plus de pointeurs, plus de gestion-mémoire, de l'idée au programme en un minimum de lignes. Tout cela trivial à apprendre, gratuit, qui peut être redistribué, fonctionnant sous Unix (tous les Unix) et sous Windows. Capable de faire des interfaces graphiques de manière très facile, de la programmation CGI en plaisantant. Facile à expliquer. Génial.
Ce programmeur, c'est moi. Et j'ai très envie de vous faire partager cette passion pour mon langage préféré.
Et la concurrence ?
Il y a de très nombreux concurrents au Tcl/Tk :
Tous ces langages ont des avantages et des inconvénients. Mes critères de choix principaux sont :
Un dernier avantage est que le Tcl n'a pas une ambition infinie. Le Tcl ne veut pas TOUT faire. C'est juste un langage de "colle" pour faire tenir un ensemble d'application ensemble. Si vous voulez faire des choses très grosses ou très complexes ou très rapides, vous êtes priés de vous tourner vers le C, le C++ ou le java.
À cette lumière, il ne reste que le python et le tcl, à la limite le Perl. La syntaxe du Perl me rend fou, donc je l'exclus. Je m'intéresse au Python.
Autres avantages.
Les points suivants méritent d'être soulignés :
Inconvénients.
Tout n'est pas parfait en tcl.
Historique.
Tcl fut créé en 1990 par John OUSTERHOUT à l'Université de Berkeley. C'est un langage de "collage" pour attacher ensemble plusieurs applications. C'est un langage interprété, mais compilé à la volée depuis la version 8.0. La version actuelle ("en janvier 2016") est Tcl 8.6.4.
Après Berkeley, John Ousterhout est passé chez Sun, puis il a créé sa propre société Scriptix qui est devenue ensuite Ajuba Solutions et a été rachetée récemment. Des centaines de programmes et de société utilisent le tcl, mais souvent de manière souterraine. Tcl est donc un langage discret.
Vos premiers pas en Tcl.
Le premier pas.
Pour démarrer un interpréteur tcl, tapez :
Alternativement, sous Windows, allez dans le menu "démarrer", déroulez-le sous menu tcl puis cliquez sur tclsh ou wish (plutôt wish).
Vous obtenez alors un invite de commande en %. Taper les lignes suivantes :
% set mytext "Wikilivre pour apprendre Tcl"
Wikilivre pour apprendre Tcl
% puts $mytext
Wikilivre pour apprendre Tcl
% set i 0
0
% puts $i
0
% incr i
1
% string toupper $mytext
WIKILIVRE POUR APPRENDRE TCL
Les points clés de cet exemple sont :
"COMMANDES" 
set nom_de_variable "valeur"
puts "chaîne de caractères"
incr nom_de_variable_numérique [incrément]
Le deuxième pas.
% for { set i 0 } { $i < 3 } { incr i } { 
 puts $i 
 puts "$i" 
 puts [string toupper "Free&ALter Soft : $i"] 
0 
0 
FREE&ALTER SOFT : 0 
1 
1 
FREE&ALTER SOFT : 1 
2 
2 
FREE&ALTER SOFT : 2 
% #this is a remarque 
% set i 0; set j 1; #that also 
1 
"COMMANDES" 
 for { initialisation } { end condition } { incrementation } {
 code running at each loop
"SYNTAXE" 
La syntaxe du tcl.
Un des problèmes du tcl est sa simplicité. Concernant sa syntaxe, il n'y a que 2 choses à savoir.
"Le premier mot de la commande est TOUJOURS la commande."
Donc en tcl, pour initialiser une variable on écrit :
ET PAS 
"Les arguments de la commande sont séparés les uns des autres par des espaces."
D'où obligatoirement :
Et non pas
La clé du tcl : la substitution.
Il y a une finesse en tcl. Les substitutions. L'interprétation d'une ligne se fait en 2 temps :
Donc :
L'exécution d'un code entre [] et la substitution dans l'expression appelante du contenu de [] par son résultat. C'est ce que l'on appelle de la programmation fonctionnelle. Le LISP est l'archétype de ces langages. Le tcl permet de mélanger élégamment programmation fonctionnelle et procédurale. Dans certains cas (les traitements sur des chaînes de caractères) la programmation fonctionnelle est TRÈS (très, vraiment très, j'insiste encore ? non) pratique.
Pour empêcher la substitution, on utilise les accolades { } :
Pour affiner ces notions, on peut ajouter que le caractère\ (barre oblique inverse), force l'interprétation du caractère suivant comme étant un simple caractère et rien d'autre :
Et que l'on peut utiliser les accolades autour d'un nom de variable pour lever l'ambiguïté :
Si vous avez complètement compris ce qui précédait, alors une friandise (sinon c'est le moment de piquer un roupillon, de papoter avec les voisins, de se taper un carton, de relever ses textos, et de noter qu'il faut relire le paragraphe qui suit dans 15 jours).
L'instruction "eval" permet de forcer une évaluation supplémentaire, et de temps en temps c'est fantastique (le préprocesseur de tcl est tcl contrairement au C):
Types de données.
Les chaînes de caractères et les scalaires.
 * scalaire : tcl 7.6 - chaînes seulement => tcl 8.0 - chaînes et valeurs.
Tout est chaîne en tcl : c'est la clé de la facilité d'interaction : toute fonction peut envoyer des résultats à n'importe quelle autre.
"COMMANDES" 
"SYNTAXE" 
Les listes.
On utilise beaucoup les listes en tcl. 
Chaînes et expressions régulières.
Les expressions régulières sont une fonction clé des langages de scripts (ksh, Perl, awk, tcl, python, ...). Elles ne sont pas du tout naturelles, mais une fois comprises, elles sont un outil très puissant. "Vous devez les essayer !"
Une seule méthode pour survivre en United States of Regular Expressions : "essayez d'abord", puis programmez. Même une ceinture noire 4ème dan de tcl fait comme cela.
"COMMANDES"
Commandes de contrôle.
Conditions, boucles, contrôle de l'exécution.
Les options -exact -glob et -regexp permettent de choisir le type de règle de comparaison utilisé. Pour distinguer les options de switch de l'argument final de switch on utilise -- :
Si l'on est en mode -exact de switch, on cherche la section de switch dont la valeur est strictement identique à l'argument de switch.
Si l'on est en mode -glob, alors * remplace n'importe quel caractère zéro ou plusieurs fois. Donc :
Enfin en mode regexp, on utilise un mode de comparaison de type expression régulière.
Un exemple plus complet :