EXPR

expr expression_mathématique

evalue le résultat d'une expression mathématique

Exemple:

expr 1/3

Comme vous le savez les variables en tcl ne sont pas typées. Ainsi le code 1+1 ne renverra pas le résultat 2.

Il faut dire à l'interpréteur tclsh que 1 est un chiffre que l'on va traiter comme une opération mathématique avec la commande expr.

Ainsi il faut écrire :

set resultat [expr 1 + 1 ] 

cela renverra bien 2 dans la variable $resultat.

Une remarque cependant :

le code :

set resultat [expr 1 / 3 ] 

renvoit 0. Pourquoi ?

Tout simplement car nous divisons un chiffre de type integer par un chiffre de type integer. Un arrondi est fait alors.

par contre le code :

le code :

set resultat [expr 1 / 3.0 ] 

renvoit 0.333333333333 avec une précision de 12 chiffres.

Nous pouvons demander une précision de 17 chiffres après la virgule par exemple en écrivant ceci :

set tcl_precision 17
set resultat [expr
1 / 3.0 ]

le résutat est : 0.33333333333333331 avec une précision de 17 chiffres.

remarque: Le dernier 1 est un arrondi suivant la norme IEEE.

Sur le même thême :

Pour aller plus loin

   Retour au sommaire Tcl

 Retour à l'accueil du site

  Documentation officielle

 

 

Flo, le 18 septembre 2026 à 09:53

Bonjour, j'ai écrit la TIP 759 (Tcl Improvement proposal n°759) [cf https://core.tcl-lang.org/tips/doc/trunk/tip/759.md]. je l'ai présenté à la core team en septembre 2026. L'idée consiste à :

  1. Introduire une substitution arithmétique : set a [(1+1)]
  2. Introduire une compilation arithmétique : proc add {x y} {($x + $y)}
  3. Améliorer le langage arithmétique :
    1. opérateur d'assignation "=" : proc init {} {( x = y = 0)}
    2. séparateur d'instructions ";"  : for {(i=0; j=0)} ...
    3. opérateur parenthèse-virgule pour générer des listes : .c create rect [($X-100, $y-50, $X+100,$y+50)]

Le prototype est fonctionnel. Il a sa branche dédié [https://core.tcl-lang.org/tcl/timeline?r=tip-759_tcl90]

Cela permet d'écrire, par exemple

[(M = ((1+1, 2+2, 3+3), (4+4, 5+5, 6+6), (7+7, 8+8, 9+9)) )]

au lieu de :

set M [list \[list [expr {1+1}] [expr {2+2}] [expr {3+3}]] [list [expr {4+4}] [expr {5+5}] [expr {6+6}]] [list [expr {7+7}] [expr {8+8}] [expr {9+9}]]]

Si l'idée est retenue, nous serons sur un cycle de 2 années pour la mettre en place.

Ce genre de possibilité vous intéresserait-il ?