45 lines
5.6 KiB
HTML
45 lines
5.6 KiB
HTML
|
<HTML><HEAD>
|
|||
|
<BASEFONT FACE="Times New Roman" SIZE="2" COLOR="#000000">
|
|||
|
</HEAD>
|
|||
|
<BODY>
|
|||
|
<div><H3><b>upvar Commandes Internes Tcl</b></H3></div>
|
|||
|
<HR ALIGN="center">
|
|||
|
<div><b>NOM</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">upvar - Cr<43>e un lien vers une variable dans un cadre de pile diff<66>rent
|
|||
|
</div><br>
|
|||
|
<div><b>SYNTAXE</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;"><b>upvar </b>?<i>level</i>? <i>otherVar myVar </i>?<i>otherVar myVar </i>...?
|
|||
|
</div><br>
|
|||
|
<div><b>DESCRIPTION</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Cette commande pr<70>pare une ou plusieurs variables locales dans la fonction courante <20> se referer <20> des variables dans un appel de fonction externe ou <20> des variables globales. <i>Level</i> peut avoir quelconque des formes permises pour la commande<A HREF="177.htm"><b> uplevel</b></A>, et peut <20>tre omis si la premi<6D>re lettre de la premi<6D>re <i>otherVar</i> n'est pas <b>#</b> ou un chiffre (il est par d<>faut de <b>1</b>). Pour chaque argument<i> otherVar</i>, <b>upvar</b> rend la variable de ce nom dans le cadre de fonction indiqu<71> par <i>level</i> (ou au niveau global, si <i>niveau</i> est <b>#0</b>) accessible dans la fonction courante par le nom donn<6E> dans l'argument correspondant <i>myVar</i>. Le nom de variable <i>otherVar</i> n'a pas besoin d'exister <20> l'instant de l'appel il sera cr<63><72> la premi<6D>re fois que <i>myVar</i> est r<>f<EFBFBD>renc<6E>e, juste comme une variable ordinaire. Il ne doit pas exister une variable du nom de <i>myVar</i> <20> l'instant o<> <b>upvar</b> est appel<65>e. <i>MyVar</i> est toujours trait<69> comme le nom d'une variable, pas un <20>l<EFBFBD>ment de tableau. M<>me si le nom ressemble <20> un <20>l<EFBFBD>ment detableau, tel que <b>a(b)</b>, une variable ordinaire est cr<63><72>e. <i>OtherVar</i> peut se referer <20> une variable scalaire , un tableau, ou un <20>l<EFBFBD>ment de tableau. <b>Upvar</b> retourne une cha<68>ne vide. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">La commande <b>upvar</b> simplifie l'impl<70>mentation d'appel-par-nom des fonctions et facilite aussi la cr<63>ation de structures de contr<74>le en tant que fonctions Tcl. Par exemple, consid<69>rez les fonctions suivantes: </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>proc add2 name {<br>
|
|||
|
</b><b> upvar $name x<br>
|
|||
|
</b><b> set x [expr $x+2]<br>
|
|||
|
</b><b>}</b></div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;"><b>Add2</b> est appel<65>e avec un argument donnant le nom d'une variable, et elle ajoute deux <20> la valeur de cette variable. Bien que <b>add2</b> aurait pu <20>tre impl<70>ment<6E>e en utilisant <A HREF="177.htm"><b>uplevel</b></A> au lieu de <b>upvar</b>, <b>upvar</b> simplifie l'acc<63>s aux variables de <b>add2</b> dans le cadre de la fonction appelante. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;"><b>namespace eval</b> est une autre fa<66>on (en plus des appels de fonction)de changer le contexte de nom Tcl. Elle ajoute un cadre d'appel <20> la pile pour repr<70>senter le contexte namespace. Ceci signifie que chaque commande <b>namespace eval</b> compte comme un niveau d'appel suppl<70>mentaire pour les commandes<A HREF="177.htm"><b> uplevel</b></A> et <b>upvar</b>. Par exemple, <b>info level 1</b> renverra une liste d<>crivant une commande qui est soit l'appel de fonction le plus externe ou la commande <b>namespace eval </b>la plus externe. Egalement, <b>uplevel #0</b> <20>value un script au premier plan dans le namespace le plus externe (le namespace global ). </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Si une variable upvar est effac<61>e (ex. <b>x</b> dans <b>add2</b> plus haut), l'op<6F>ration <A HREF="175.htm"><b>unset</b></A> affecte la variable li<6C>e, pas la variable upvar. Il n'y a aucun moyen d'effacer une variable upvar except<70> en sortant de la fonction dans lequel elle est d<>finie. N<>anmoins, il est possible de recibler une variable upvar par l'ex<65>cution d'une autre commande<b> upvar</b>.
|
|||
|
</div><br>
|
|||
|
<div><b>Traces et upvar</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Upvar interagit avec les traces d'une mani<6E>re directe mais qui peut <20>tre inattendue. Si une trace de variable est d<>finie sur <i>otherVar</i>, cette trace sera d<>clench<63>e par les actions impliquant <i>myVar</i>. N<>anmoins, <20> la fonction trace sera transmis le nom de <i>myVar</i>, plut<75>t que le nom de <i>otherVar</i>. Ainsi, la sortie du code suivant sera <b>localVar</b> plut<75>t que <b>originalVar</b>: </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>proc traceproc { name index op } {<br>
|
|||
|
</b><b> puts $name<br>
|
|||
|
</b><b>}<br>
|
|||
|
</b><b>proc setByUpvar { name value } {<br>
|
|||
|
</b><b> upvar $name localVar<br>
|
|||
|
</b><b> set localVar $value<br>
|
|||
|
</b><b>}<br>
|
|||
|
</b><b>set originalVar 1<br>
|
|||
|
</b><b>trace variable originalVar w traceproc<br>
|
|||
|
</b><b>setByUpvar originalVar 2<br>
|
|||
|
</b><b>}</b></div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;"> Si <i>otherVar</i> se ref<65>re <20> un <20>l<EFBFBD>ment de tableau, alors les traces de variables fix<69>e pour le tableau entier ne seront pas appel<65>es quand <i>myVar</i> est acc<63>d<EFBFBD>e (mais les traces sur un <20>l<EFBFBD>ment particulier pourront <20>tre appel<65>es). En particulier, si le tableau est <b>env</b>, alors les changement faits <20> <i>myVar</i> ne seront pas transmis au sous-processus correctement
|
|||
|
</div><br>
|
|||
|
<div><b>VOIR EGALEMENT</b></div><br>
|
|||
|
<div><A HREF="141.htm">namespace</A>(n)</div>
|
|||
|
<br>
|
|||
|
<br><div ALIGN="CENTER"><A HREF="index.htm"><b>Index</b></A> <A HREF="177.htm"><b>Pr<EFBFBD>c<EFBFBD>dent</b></A> <A HREF="179.htm"><b>Suivant</b></A>
|
|||
|
</div>
|
|||
|
</BODY></HTML>
|