====== uplevel ======
Exécute un script dans un cadre de pile différent
===== Syntaxe =====
uplevel ?level? arg ?arg ...?
===== Description =====
Tous les arguments //arg// sont concaténés comme si ils avait été transmis à [[:tcl:concat]]; le résultat est alors évalué dans le contexte de variable indiqué par //level//. **uplevel** retourne le résultat de cette évaluation.
* Si //level// est un entier alors cela donne la distance (au-dessus de la pile d'appel de la fonction) à franchir avant l'exécution de la commande.
* Si //level// consiste en # suivi par un nombre alors le nombre donne un numéro absolu de niveau.
* Si //level// est omis alors il est par défaut de 1
//level// ne peut pas avoir la valeur par défaut si le premier argument //command// commence avec un chiffre ou un #.
Par exemple, supposez que la fonction a a été appelée au premier plan, et qu'elle a appelé b, et que b appelé c. Supposez que c appelle la commande **uplevel**.
* Si //level// est 1 ou #2 ou omis, alors la commande sera exécutée dans le contexte de variable de b
* Si //level// est 2 ou #1 alors la commande sera exécutée dans le contexte de variable de a.
* Si //level// est 3 ou #0 alors la commande sera exécutée au premier plan (seulement les variables globales seront visibles).
La commande **uplevel** cause la disparition de la fonction appelante de la pile d'appel pendant que la commande est exécutée. Dans l'exemple ci-dessus, supposez que c appelle la commande `uplevel 1 {set x 43; d}` où d est une autre fonction Tcl. La commande [[:tcl:set]] modifiera la variable x dans le contexte de b, et d s'exécutera au niveau 3, comme si elle était appelée de b. Si elle exécute ensuite la commande `uplevel {set x 42}` alors la commande set modifiera la même variable x dans le contexte de b: la fonction c n'apparait pas être sur la pile d'appel quand d s'exécute. La commande [[:tcl:info#level|info level]] peut être employée pour obtenir le niveau de la fonction courante.
**uplevel** rend possible l'implémentation de nouvelles structures de contrôle comme fonctions Tcl (par exemple, **uplevel** pourrait être utilisée pour implémenter la construction [[:tcl:while]] comme fonction Tcl).
[[:tcl:namespace#eval|namespace eval]] est une autre façon (outre l'appel de fonction) de modifier le contexte de nom Tcl. Elle ajoute un cadre d'appel à la pile pour représenter le contexte namespace. Ceci signifie que chaque commande **namespace eval** compte comme un autre niveau d'appel pour les commandes **uplevel** et [[:tcl:upvar]]. Par exemple, `info level 1` renverra une liste décrivant une commande qui est soit l'appel de fonction le plus externe ou la commande **namespace eval** la plus externe. Également, `uplevel #0` évalue un script au premier plan dans le namespace le plus externe (le namespace global)
===== Exemples =====
===== Voir aussi =====
{{tag>tcl}}