Tool Command Language - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Description

Tcl est facile à apprendre, surtout pour un habitué du langage C ou quelqu'un qui connaît un shell. Bien que la syntaxe semble dans un premier abord assez similaire au C, en vérité elle est beaucoup plus simple. Le langage a également des aspects communs avec Lisp et Forth. Il permet de développer très rapidement des logiciels de petite ou moyenne taille. De plus, il est facile d'intégrer différents autres logiciels avec une IHM en Tcl/Tk.

Tcl est surtout connu pour son extension graphique Tk. Tcl/Tk permet de concevoir des applications fenêtrées indépendamment de la plateforme (UNIX / Mac OS / Windows) à la manière du langage Java.

Tcl étant un langage interprété, le développement d'un programme est rapide et peut s'effectuer par touches successives. Cette méthode de travail correspond à un cycle de développement en cascade.

Tcl facilite l'accès aux fonctions de son interprète, ce qui contribue à la puissance du langage et le place à mi-chemin entre un langage fonctionnel comme Lisp et un langage impératif comme BASIC.

Tcl est intégré ou embarqué avec de nombreuses applications grâce à sa syntaxe simple (par exemple, Oracle). L'une de ses forces est la réalisation aisée d'une suite de tests unitaires pour une application donnée. La réalisation aisée de tests de validation rend le développement incrémental très facile (à la manière de Forth).

Difficultés et pièges

Tcl est un langage extrêmement simple, et très puissant. C'est précisément ce qui lui permet d'exécuter du code qu'un compilateur, ou un autre interpréteur refuserait... et de donner un résultat bien différent de celui auquel le développeur s'attendait. Les sites consacrés au développement sous Tcl [réf. souhaitée] donnent des conseils aux développeurs débutants pour qu'ils prennent de bonnes habitudes.

Noms de variable et littéraux

Se souvenir qu'un nom de variable ne s'écrit pas différemment d'un littéral.

      % puts x        x      % set x a        a      % puts "x $x"        x a      % puts 0        0      % set 0 1        1      % puts $0        1      

Substitutions

Les substitutions peuvent donner des résultats surprenants.

      % set x 1        1      % set y x        x      % set $y 2; #Equivaut à set x 2        2      % puts $x        2      

Il n'y a pas de différence entre le code et les données, en ce sens qu'une chaîne de caractères quelconque peut devenir du code. Là encore, attention au jeu des substitutions.

      set i 0;      set cond1 "$i<5"; #! Attention, cond1 est déjà égal à la chaîne "0<5"       set cond2 {$i<5}; #! Ici, il n'y a pas de substitution, cond2 est égal à "$i<5"      set incre {set i [expr $i+1]; puts $i}      while $cond2 $incre; # Cette boucle s'exécute 5 fois.      set i 0;      while $cond1 $incre; # Cette boucle ne se termine jamais.      

Exemples

      proc ! x {expr {$x<2? 1: $x*[! [incr x -1]]}}      
  • Faire la somme d'une liste de nombres

Avec une boucle foreach parcourant la liste :

      set nombres {10 9 8 7 6 5 4 3 2 1}      set somme 0      foreach i $nombres {          set somme [expr {$somme + $i}]      }      

Ou en plus compact en utilisant la commande join :

      set somme [expr [join $nombres +]]      

Remarquons qu'un opérateur est un caractère comme un autre, il peut donc être stocké dans une variable :

      foreach op {+ * - /} {         set resultat [expr [join $nombres $op]]         puts "Le résultat pour l'opérateur $op vaut $resultat"      }      
  • Substituer des caractères selon une table de correspondance avec la commande string :
      set sequence "ACGTATTACGGTCCATGAACGAATTGGGATATCGACCATGATGGAATTCTG"      puts [string map {GA R TC Y GT K AC M GC S AT W} $sequence]      

Ensuite donner la fréquence d'apparition des lettres (A, C, T, G) dans la séquence en utilisant un tableau associatif (array), la commande split pour isoler chaque motif et la commande d'introspection (info) de l'interprète :

      foreach nucleotide [split $sequence ""] {         if ![info exists compte($nucleotide)] {           set compte($nucleotide) 1         } else {incr compte($nucleotide)}      }             foreach nucleotide [array names compte] {         puts "$nucleotide -> $compte($nucleotide)"      }      
  • Télécharger une page HTML
      package require http      puts [http::data [http::geturl http://mini.net/tcl/540]]      
Page générée en 0.080 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise