====== 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}}