projman/hlp/fr/tcl/upvar.htm
2015-10-19 14:27:31 +04:00

45 lines
5.6 KiB
HTML

<HTML><HEAD>
<BASEFONT FACE="Times New Roman" SIZE="2" COLOR="#000000">
</HEAD>
<BODY>
<div><H3><b>upvar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Commandes Internes Tcl</b></H3></div>
<HR ALIGN="center">
<div><b>NOM</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">upvar - Crée un lien vers une variable dans un cadre de pile diffé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épare une ou plusieurs variables locales dans la fonction courante à se referer à des variables dans un appel de fonction externe ou à 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 être omis si la première lettre de la premiè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é 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é dans l'argument correspondant <i>myVar</i>. Le nom de variable <i>otherVar</i> n'a pas besoin d'exister à l'instant de l'appel il sera créé la première fois que <i>myVar</i> est référencée, juste comme une variable ordinaire. Il ne doit pas exister une variable du nom de <i>myVar</i> à l'instant où <b>upvar</b> est appelée. <i>MyVar</i> est toujours traité comme le nom d'une variable, pas un élément de tableau. Même si le nom ressemble à un élément detableau, tel que <b>a(b)</b>, une variable ordinaire est créée. <i>OtherVar</i> peut se referer à une variable scalaire , un tableau, ou un élément de tableau. <b>Upvar</b> retourne une chaîne vide. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">La commande <b>upvar</b> simplifie l'implémentation d'appel-par-nom des fonctions et facilite aussi la création de structures de contrôle en tant que fonctions Tcl. Par exemple, considérez les fonctions suivantes: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>proc add2 name &#123;<br>
</b><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar &#36;name x<br>
</b><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set x &#91;expr &#36;x+2]<br>
</b><b>}</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;"><b>Add2</b> est appelée avec un argument donnant le nom d'une variable, et elle ajoute deux à la valeur de cette variable. Bien que <b>add2</b> aurait pu être implémentée en utilisant <A HREF="177.htm"><b>uplevel</b></A> au lieu de <b>upvar</b>, <b>upvar</b> simplifie l'accè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çon (en plus des appels de fonction)de changer le contexte de nom Tcl. Elle ajoute un cadre d'appel à la pile pour représenter le contexte namespace. Ceci signifie que chaque commande <b>namespace eval</b> compte comme un niveau d'appel supplé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> é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ée (ex. <b>x</b> dans <b>add2</b> plus haut), l'opération <A HREF="175.htm"><b>unset</b></A> affecte la variable liée, pas la variable upvar. Il n'y a aucun moyen d'effacer une variable upvar excepté en sortant de la fonction dans lequel elle est définie. Néanmoins, il est possible de recibler une variable upvar par l'exé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ère directe mais qui peut être inattendue. Si une trace de variable est définie sur <i>otherVar</i>, cette trace sera déclenchée par les actions impliquant <i>myVar</i>. Néanmoins, à la fonction trace sera transmis le nom de <i>myVar</i>, plutôt que le nom de <i>otherVar</i>. Ainsi, la sortie du code suivant sera <b>localVar</b> plutôt que <b>originalVar</b>: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>proc traceproc &#123; name index op } &#123;<br>
</b><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts &#36;name<br>
</b><b>}<br>
</b><b>proc setByUpvar &#123; name value } &#123;<br>
</b><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar &#36;name localVar<br>
</b><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set localVar &#36;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ère à un élément de tableau, alors les traces de variables fixée pour le tableau entier ne seront pas appelées quand <i>myVar</i> est accédée (mais les traces sur un élément particulier pourront être appelées). En particulier, si le tableau est <b>env</b>, alors les changement faits à <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>&nbsp;&nbsp;<A HREF="177.htm"><b>Précédent</b></A>&nbsp;&nbsp;<A HREF="179.htm"><b>Suivant</b></A>
</div>
</BODY></HTML>