projman/hlp/fr/tcl/namespace.htm

196 lines
27 KiB
HTML
Raw Normal View History

2015-10-19 13:27:31 +03:00
<HTML><HEAD>
<BASEFONT FACE="Times New Roman" SIZE="2" COLOR="#000000">
</HEAD>
<BODY>
<div><H3><b>namespace&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;">namespace - cr<63>e et manipule des contextes pour les commandes et variables
</div><br>
<div><b>SYNTAXE</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;"><b>namespace </b>?<i>option</i>? ?<i>arg ...</i>?
</div><br>
<div><b>DESCRIPTION</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">La commande <b>namespace</b> vous permet de cr<63>er, d'acceder, et de d<>truire des contextes s<>par<61>s pour les commandes et variables. Voir la section <b>QU'EST CE QU'UN NAMESPACE?</b> ci-dessous pour un bref aper<65>u des namespaces. Les <i>option</i>s l<>gales sont list<73>es ci-dessous. Notez que vous pouvez abr<62>ger les <i>option</i>s.
<DL>
<DT><br><b>namespace children </b>?<i>namespace</i>? ?<i>pattern</i>?
</DT><DD>Renvoie une liste de tous les namespaces enfants qui appartiennent <20> <i>namespace</i>. Si <i>namespace</i> n'est pas sp<73>cifi<66>, alors les enfants sont renvoy<6F>s pour le namespace courant. Cette commande retourne des noms pleinement qualifi<66>s, qui commencent avec <b>::</b>. Si l'option <i>pattern</i> est donn<6E>e, alors cette commande retourne seulement les noms qui correspond au mod<6F>le glob-style. Le mod<6F>le actuel utilis<69> est d<>termin<69> comme suit: un mod<6F>le qui commence avec <b>::</b> est utilis<69> directement, autrement le namespace <i>namespace</i> (ou le nom pleinement qualifi<66> du namespace courant) est ajout<75> au mod<6F>le.
</DD>
<DT><br><b>namespace code </b><i>script</i>
</DT><DD>Capture le contexte namespace courant pour une ex<65>cution ult<6C>rieure du script <i>script</i>. Retourne un nouveau script dans lequel <i>script</i> aura <20>t<EFBFBD> englob<6F> dans une commande<b> </b><b>namespace code</b>. Le nouveau script a deux propri<72>t<EFBFBD>s importantes. D'abord, il peut <20>tre <20>valu<6C> dans tout namespace et provoquera l'<27>valuation de <i>script</i> dans le namespace courant (celui o<> la commande <b>namespace code</b> a <20>t<EFBFBD> appel<65>e).
Deuxi<EFBFBD>mement, des arguments suppl<70>mentaires peuvent <20>tre ajout<75>s au script r<>sultant et ils seront transmis <20> <i>script</i> comme arguments additionels. Par exemple, supposez que la commande <b>set script &#91;namespace code &#123;foo bar}]</b> est appel<65>e dans le namespace <b>::a::b</b>. Ensuite <b>eval &quot;&#36;script x y&quot;</b> peut <20>tre ex<65>cut<75> dans tout namespace (en supposant que la valeur de <b>script</b> lui ait <20>t<EFBFBD> transmise correctement) et aura le m<>me effet que la commande <b>namespace eval ::a::b &#123;foo bar x y}</b>. Cette commande est n<>cessaire parce que les extensions comme Tk ex<65>cutent normalement les scripts callback dans le namespace global . Une commande visible capture une commande et son contexte namespace de fa<66>on <20> l'ex<65>cuter correctement plus tard. Voir la section <b>VALEURS VISIBLES</b> pour quelques exemples montrant comment l'utiliser pour cr<63>er des scripts callback.
</DD>
<DT><br><b>namespace current</b>
</DT><DD>Renvoie le nom pleinement qualifi<66> pour le namespace courant. Le nom actuel du namespace global est &quot;&quot; (ex., une cha<68>ne vide), mais cette commande retourne <b>::</b> pour le namespace global par conv<6E>nience pour les programmeurs.
</DD>
<DT><br><b>namespace delete </b>?<i>namespace namespace ...</i>?
</DT><DD>Chaque namespace <i>namespace</i> est effac<61> et toutes variables, fonctions, et namespaces enfants contenus dans le namespace sont effac<61>s. Si une fonction est en cours d'ex<65>cution dans le namespace, le namespace sera maintenu jusqu'a ce que la fonction retourne; n<>anmoins, le namespace est marqu<71> pour emp<6D>cher tout autre code de le rechercher par son nom. Si un namespace n'existe pas, cette commande retourne une erreur. Si aucuns noms de namespace ne sont donn<6E>s, cette commande ne fait rien.
</DD>
<DT><br><b>namespace eval</b> <i>namespace arg</i> ?<i>arg ...</i>?
</DT><DD>Active un namespace appel<65> <i>namespace</i> et <20>value tout code dans ce contexte. Si le namespace n'existe pas d<>j<EFBFBD>, il est cr<63><72>. Si plus d'un argument <i>arg</i> est sp<73>cifi<66>, les arguments sont concat<61>n<EFBFBD>s, s<>par<61>s par des espaces de la m<>me fa<66>on qu'avec la commande<A HREF="104.htm"><b> eval</b></A>, et le r<>sultat est <20>valu<6C>.
<br>Si <i>namespace</i> a des qualificateurs namespace en t<>te et que les namespaces en t<>te n'existent pas, ils sont automatiquement cr<63><72>s.
</DD>
<DT><br><b>namespace export </b>?-<b>clear</b>? ?<i>pattern pattern ...</i>?
</DT><DD>Sp<EFBFBD>cifie quelles commandes sont export<72>es par un namespace. Le commandes export<72>es sont celles qui peuvent <20>tre plus tard import<72>es dans un autre namespace en utilisant une commande<b> namespace import</b>. L'ensembles des commandes d<>finies dans un namespace et des commandes que le namespace a pr<70>cedemment import<72> peut <20>tre export<72> par un namespace. La commandes n'ont pas <20> <20>tre d<>finies <20> l'instant o<> la commande <b>namespace export</b> est ex<65>cut<75>e. Chaque <i>pattern</i> peut contenir des caract<63>res sp<73>ciaux glob-style, mais il ne peut pas inclure quelconque qualificateurs namespace. Ainsi, le mod<6F>le peut seulement sp<73>cifier des commandes dans le namespace courant (exportant). Chaque <i>pattern</i> est ajout<75> <20> la liste de mod<6F>les d'export du namespace. Si le flag -<b>clear</b> est donn<6E>, la liste de mod<6F>les d'export du namespace est r<>initialis<69>e en cha<68>ne vide avant que quelconques <i>pattern</i> arguments soient ajout<75>s. Si aucuns <i>pattern</i>s ne sont donn<6E>s et que le flag -<b>clear</b> n'est pas fourni, cette commande retourne la liste d'export du namespace courant.
</DD>
<DT><br><b>namespace forget </b>?<i>pattern pattern ...</i>?
</DT><DD>Red<EFBFBD>place les commandes pr<70>cedemment import<72>es d'un namespace. Chaque <i>pattern</i> est un nom qualifi<66> tel que <b>foo::x</b> ou <b>a::b::p*</b>. Les noms qualifi<66>s contiennent des <b>::</b>s et qualifient un nom avec le nom d'un ou plusieurs namespaces. Chaque <i>pattern</i> est qualifi<66> avec le nom d'un namespace exportant et peut avoir des caract<63>res sp<73>ciaux glob-style dans le nom de commande <20> la fin du nom qualifi<66>. Les caract<63>res glob ne peuvent pas apparaitre dans un nom de namespace. Cette commande trouve en premier les commandes export<72>es correspondantes. Elle v<>rifie ensuite si une ou plusieurs de ces commandes ont <20>t<EFBFBD> pr<70>cedemment import<72>es par le namespace courant. Si c'est le cas, cette commande efface les commandes import<72>es correspondantes. Ceci annule effectivement l'action d'une commande<b> namespace import</b>.
</DD>
<DT><br><b>namespace import </b>?<b>-force</b>? ?<i>pattern</i> <i>pattern ...</i>?
</DT><DD>Importe des commandes dans un namespace. Chaque <i>pattern</i> est un nom qualifi<66> comme <b>foo::x</b> ou <b>a::p*</b>. Ainsi, elle inclut le nom d'un namespace exportant et peut avoir des caract<63>res sp<73>ciaux <i>glob-style </i>dans le nom de commande <20> la fin du nom qualifi<66>. Les caract<63>res <i>glob</i> ne peuvent pas apparaitre dans un nom de namespace. Toutes les commandes qui correspondent <20> une cha<68>ne <i>pattern</i> et qui sont couramment export<72>es de leurs namespace sont ajout<75>es au namespace courant. Ceci est fait par cr<63>ation d'une nouvelle commande dans le namespace courant qui pointe vers la commande export<72>e dans son namespace original; quand la nouvelle commande import<72>e est appel<65>e, elle appelle la commande export<72>e. Cette commande normalement retourne une erreur si une commande import<72>e rentre en conflit avec une commande existante. N<>anmoins, si l'option -<b>force</b> est donn<6E>e, les commandes import<72>es remplaceront silencieusement les commandes existantes. La commande <b>namespace import</b> a une s<>mantique photographique: ainsi, seulement les commandes requises couramment d<>finies dans le namespace exportant sont import<72>es. En d'autres mots, vous pouvez importer seulement les commandes qui sont dans un namespace <20> l'instant o<> la commande <b>namespace import</b> est ex<65>cut<75>e. Si une autre commande est d<>finie et export<72>e dans ce namespace plus tard, elle ne sera pas import<72>e.
</DD>
<DT><br><b>namespace inscope</b> <i>namespace arg</i> ?<i>arg ...</i>?
</DT><DD>Execute un script dans le contexte d'un namespace particulier. Cette commande n'est pas sens<6E>e <20>tre utilis<69> directement par les programmeurs; des appels sont g<>n<EFBFBD>r<EFBFBD>s implicitement quand les applications utilisent la commande <b>namespace code</b> pour cr<63>er scripts callback que l'applications alors enregistre avec, par ex., des widgets Tk. La commande <b>namespace inscope</b> ressemble plus <20> la commande <b>namespace eval</b> except<70> qu'elle a une s<>mantique <A HREF="128.htm"><b>lappend</b></A> et que le namespace doit d<>j<EFBFBD> exister. Elle traite le premier argument comme une liste, et ajoute tout argument apr<70>s le premier jusqu'<27> la fin comme des <20>l<EFBFBD>ments de liste correcte. <b>namespace inscope ::foo a x y z</b> est <20>quivalent <20> <b>namespace eval ::foo &#91;concat a &#91;list x y z]]</b> Cette s<>mantique <A HREF="128.htm"><b>lappend</b></A> est importante parce que de nombreux scripts callback sont actuellement des pr<70>fixes.
</DD>
<DT><br><b>namespace origin </b><i>command</i>
</DT><DD>Renvoie le nom pleinement qualifi<66> de la commande originale <20> laquelle la commande import<72>e <i>command</i> se r<>f<EFBFBD>re. Quand une commande est import<72>e dans un namespace, une nouvelle commande est cr<63><72>e dans ce namespace qui pointe vers la commande actuelle dans le namespace exportant. Si une commande est import<72>e dans une s<>quence de namespaces <i>a, b,...,n</i> o<> chaque namespace successif importe juste la commande du pr<70>cedent namespace, cette commande retourne le nom pleinement qualifi<66> de la commande originale dans le premier namespace, <i>a</i>. Si <i>command</i> ne se ref<65>re pas <20> une commande import<72>e, le propre nom pleinement qualifi<66> de la commande est renvoy<6F>.
</DD>
<DT><br><b>namespace parent</b> ?<i>namespace</i>?
</DT><DD>Renvoie le nom pleinement qualifi<66> du namespace parent de <i>namespace</i>. Si <i>namespace</i> n'est pas sp<73>cifi<66>, le nom pleinement qualifi<66> du parent du namespace courant est renvoy<6F>.
</DD>
<DT><br><b>namespace qualifiers</b> <i>string</i>
</DT><DD>Renvoie tous les qualificateurs namespace en t<>te de <i>string</i>. Les qualificateurs sont les noms de namespace s<>par<61>es par <b>::</b>. Pour la <i>string</i> <b>::foo::bar::x</b>, cette commande retourne <b>::foo::bar</b>, et pour <b>::</b> elle retourne une cha<68>ne vide. Cette commande est le compl<70>ment de la commande<b> namespace tail</b>. Notez qu'elle ne v<>rifie pas si les noms de namespace sont, en fait, les noms des namespaces couramment d<>finis.
</DD>
<DT><br><b>namespace tail</b> <i>string</i>
</DT><DD>Renvoie le simple nom <20> la fin d'une cha<68>ne qualifi<66>e. Les qualificateurs sont les noms de namespace s<>par<61>es par <b>::</b>. Pour la <i>string</i> <b>::foo::bar::x</b>, cette commande retourne <b>x</b>, et for <b>::</b> elle retourne une cha<68>ne vide. Cette commande est le complement de la commande<b> namespace qualifiers</b>. Elle ne v<>rifie pas si les noms de namespace sont, en fait, les noms des namespaces couramment d<>finis.
</DD>
<DT><br><b>namespace which</b> ?-<b>command</b>? ?-<b>variable</b>? <i>name</i>
</DT><DD>Recherche <i>name</i> soit comme commande ou variable et retourne son nom pleinement qualifi<66>. Par exemple, si <i>name</i> n'existe pas dans le namespace courant mais existe dans le namespace global, cette commande retourne un nom pleinement qualifi<66> dans le namespace global. Si la commande ou variable n'existe pas, cette commande retourne une cha<68>ne vide. Si la variable a <20>t<EFBFBD> cr<63><72>e mais non d<>finie, tel qu'avec la commande <A HREF="179.htm"><b>variable</b></A> ou au travers d'une <A HREF="173.htm"><b>trace</b></A> sur la variable, cette commande renverra le nom pleinement qualifi<66> de la variable. Si aucun flag n'est donn<6E>, <i>name</i> est trait<69> comme un nom de commande. Voir la section <b>RESOLUTION</b> <b>DE</b> <b>NOM </b>ci-dessous pour une explication des r<>gles concernant la r<>solution de nom.
</DD>
</DL>
</div> <br>
<div><b>QU'EST CE QU'UN NAMESPACE?</b></div> <br>
<div ALIGN="LEFT" style="margin-left: 51px;">Un namespace est une collection de commandes et de variables. Il encapsule les commandes et variables pour s'assurer qu'elles ne vont pas interf<72>rer avec les commandes et variables des autres namespaces. Tcl a toujours eu une telle collection, <20> laquelle nous nous r<>f<EFBFBD>rerons comme le <i>namespace global</i>. Le namespace global contient toutes les variables globales et commandes. La commande <b>namespace eval</b> vous permet de cr<63>er de nouveaux namespaces. Par exemple, </div>
<div ALIGN="LEFT" style="margin-left: 102px;">
<b>namespace eval Counter &#123;<br>
</b><b>namespace export bump<br>
</b><b>variable num 0<br>
</b><b><br>
</b><b>proc bump &#123;} &#123;<br>
</b><b>variable num<br>
</b><b>incr num<br>
</b><b>}<br>
</b><b>}</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">cr<EFBFBD>e un nouveau namespace contenant la variable <b>num</b> et la fonction <b>bump</b>. Les commandes et les variables dans ce namespace sont s<>par<61>es des autres commandes et variables dans le m<>me programme. S'il y a une commande nomm<6D>e <b>bump</b> dans le namespace global , par exemple, elle sera diff<66>rente de la commande <b>bump</b> dans le namespace<b> Counter</b>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les variables namespace ressemblent aux variables globales en Tcl. Elles existent en dehors des fonctions dans un namespace mais peuvent <20>tre acc<63>d<EFBFBD>es dans une fonction via la commande<A HREF="179.htm"><b> variable</b></A>, comme montr<74> dans l'exemple ci-dessus.</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les namespaces sont dynamiques. Vous pouvez ajouter et effacer des commandes et des variables <20> tout instant, et vous pouvez construire le contenu d'un namespace au fur et <20> mesure en utilisant une s<>rie de commandes<b> namespace eval</b>. Par exemple, les s<>ries suivantes de commandes ont le m<>me effet que les d<>finitions namespace montr<74>es plus haut: </div>
<div ALIGN="LEFT" style="margin-left: 102px;">
<b>namespace eval Counter &#123;<br>
</b><b>variable num 0<br>
</b><b>proc bump &#123;} &#123;<br>
</b><b>variable num<br>
</b><b>return &#91;incr num]<br>
</b><b>}<br>
</b><b>}<br>
</b><b>namespace eval Counter &#123;<br>
</b><b>proc test &#123;args} &#123;<br>
</b><b>return &#36;args<br>
</b><b>}<br>
</b><b>}<br>
</b><b>namespace eval Counter &#123;<br>
</b><b>rename test &quot;&quot;<br>
</b><b>}</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Notez que la fonction <b>test</b> est ajout<75>e au namespace<b> Counter</b>, et enlev<65>e plus tard via la commande<A HREF="155.htm"><b> rename</b></A>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les namespaces peuvent contenir d'autres namespaces, donc <20>tre imbriqu<71>s hi<68>rarchiquement. Un namespace imbriqu<71> est encapsul<75> dans son namespace parent et ne peut pas interf<72>rer avec d'autres namespaces. <br>
</div><br>
<div><b>NOMS QUALIFIES</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Chaque namespace a un nom textuel tel que <A HREF="121.htm"><b>history</b></A> ou <b>::safe::interp</b>. Comme les namespaces peuvent s'imbriquer, les noms qualifi<66>s sont utilis<69>s pour se r<>f<EFBFBD>rer <20> des commandes, variables, et namespaces enfants contenus dans les namespaces. Les noms qualifi<66>s sont semblables aux noms de chemin hi<68>rarchique des fichiers Unix ou des widgets Tk, except<70> que <b>::</b> est utilis<69> comme s<>parateur au lieu de '<b>/</b>' ou '<b>.</b>'. Le namespace global a pour nom &quot;&quot; (ex., une cha<68>ne vide), bien que <b>::</b> soit un synonyme. Comme exemple, le nom <b>::safe::interp::create</b> se r<>f<EFBFBD>re <20> la commande <b>create</b> dans le namespace <A HREF="126.htm"><b>interp</b></A> qui est un enfant du namespace <b>::safe</b>, qui <20> son tour est un enfant du namespace global <b>::</b>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Si vous voulez <20> acceder aux commandes et variables <20> partir d'un autre namespace, vous devez utiliser une syntaxe suppl<70>mentaire. Les noms doivent <20>tre qualifi<66>s par les namespace qui les contiennent. A partir du namespace global , nous acc<63>derions <20> la fonction <b>Counter</b> comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><br>
<b>Counter::bump 5<br>
</b><b>Counter::Reset</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Nous acc<63>derions au compte courant comme ceci: </div><br>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>puts &quot;count = &#36;Counter::num&quot;</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Quand un namespace en contient un autre, vous pouvez avoir besoin de plus d'un qualificateur pour atteindre ses <20>l<EFBFBD>ments. Si nous avions un namespace <b>Foo</b> qui contenait le namespace <b>Counter</b>, vous pourriez appeller sa fonction <b>bump</b> <20> partir du namespace global comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>Foo::Counter::bump 3</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Vous pouvez aussi utiliser les noms qualifi<66>s quand vous cr<63>ez et renommez des commandes. Par exemple, vous pouvez ajouter une fonction au namespace <b>Foo</b> comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>proc Foo::Test &#123;args} &#123;return &#36;args}</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Et vous pourriez d<>placer la m<>me fonction vers un autre namespace comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>rename Foo::Test Bar::Test</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Il y a quelques points restants au sujet des noms qualifi<66>s que nous devons couvrir. Les namespaces ont des noms non-vides except<70> le namespace global . '<b>::</b>' est interdit dans une simple commande, variable, et les noms de namespace except<70> comme s<>parateur namespace. Les '<b>:</b>' suppl<70>mentaires dans un nom qualifi<66> sont ignor<6F>s; ainsi, deux ou plus '<b>:</b>' sont trait<69>s comme s<>parateur namespace. Deux '<b>::</b>' <20> la fin d'une variable qualifi<66>e ou d'un nom de commande se r<>f<EFBFBD>rent <20> une variable ou commande nomm<6D>e &#123;}. N<>anmoins, <b>::</b> <20> la fin d'un nom de namespace qualifi<66> est ignor<6F>.
</div> <br>
<div><b>RESOLUTION DE NOM</b></div> <br>
<div ALIGN="LEFT" style="margin-left: 51px;">En g<>n<EFBFBD>ral, toute commande Tcl qui attend des noms de variable et de commande supporte les noms qualifi<66>s. Ceci signifie que vous pouvez donner des noms qualifi<66>s <20> des commandes comme <A HREF="161.htm"><b>set</b></A>, <A HREF="147.htm"><b>proc</b></A>, <A HREF="155.htm"><b>rename</b></A>, et <b>interp alias</b>. Si vous fournissez un nom pleinement qualifi<66> qui commence avec <b>::</b>, il n'y a pas d'ambiguit<69> sur le sens de la commande, la variable, ou le namespace. N<>anmoins, si le nom ne commence pas avec <b>::</b> (ex., est <i>relatif</i>), Tcl suit une r<>gle pr<70>cise pour la recherche: Les noms de commandes et nom de variables sont toujours r<>solus en cherchant en premier dans le namespace courant, et ensuite dans le namespace global . Les noms de namespace, d'un autre point de vue, sont toujours r<>solus en recherchant seulement dans le namespace courant. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Dans les exemples suivants, </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>set traceLevel 0<br>
</b><b>namespace eval Debug &#123;<br>
</b><b>printTrace &#36;traceLevel<br>
</b><b>}</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Tcl recherche <b>traceLevel</b> dans le namespace <b>Debug</b> et ensuite dans le namespace global. Il recherche la commande <b>printTrace</b> de la m<>me fa<66>on. Si un nom de variable ou de commande n'est pas trouv<75> dans ce contexte, le nom est ind<6E>fini. Pour rendre ce point tout <20> fait clair, examinez les exemples suivants: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>set traceLevel 0<br>
</b><b>namespace eval Foo &#123;<br>
</b><b>variable traceLevel 3<br>
</b><b><br>
</b><b>namespace eval Debug &#123;<br>
</b><b>printTrace &#36;traceLevel<br>
</b><b>}<br>
</b><b>}</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Ici, Tcl recherche <b>traceLevel</b> en premier dans le namespace <b>Foo::Debug</b>. Comme il n'est pas trouv<75> l<>, Tcl le recherche alors dans le namespace global . La variable <b>Foo::traceLevel</b> est compl<70>tement ignor<6F>e pendant le processus de r<>solution de nom. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Vous pouvez utiliser la commande <b>namespace which</b> pour repondre aux questions au sujet de la r<>solution de nom. Par exemple, la commande: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>namespace eval Foo::Debug &#123;namespace which-variable traceLevel}</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">retourne <b>::traceLevel</b>. d'une autre mani<6E>re, la commande, </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>namespace eval Foo &#123;namespace which-variable traceLevel}</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">retourne <b>::Foo::traceLevel</b>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Comme mentionn<6E> plus haut, les noms de namespace sont recherch<63>s diff<66>remment des noms de variables et commandes. Les noms de namespace sont toujours r<>solus dans le namespace courant. Ceci signifie que, par exemple, une commande <b>namespace eval</b> qui cr<63>e un nouveau namespace cr<63>e toujours un enfant du namespace courant <20> moins que le nouveau nom de namespace commence avec un <b>::</b>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Tcl n'a pas de contr<74>le pour limiter quelles variables, commandes, ou namespaces vous pouvez r<>f<EFBFBD>rencer. Si vous fournissez un nom qualifi<66> qui resolve un <20>l<EFBFBD>ment par les r<>gles de r<>solution de nom plus haut, vous pouvez acc<63>der <20> l'<27>l<EFBFBD>ment. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Vous pouvez acc<63>der <20> une variable namespace <20> partir d'une fonction dans le m<>me namespace en utilisant la commande<A HREF="179.htm"><b> variable</b></A>. Comme la commande<A HREF="120.htm"><b> global</b></A>, elle cr<63>e un lien local vers une variable namespace. Si n<>cessaire, elle cr<63>e aussi la variable dans le namespace courant et l'initialise. Notez que la commande <A HREF="120.htm"><b>global</b></A> cr<63>e seulement des liens vers les variables dans le namespace global . Il n'est pas n<>cessaire d'utiliser une commande <A HREF="179.htm"><b>variable</b></A> si vous vous referez toujours <20> une variable namespace en utilisant un nom qualifi<66> appropri<72>.
</div><br>
<div><b>IMPORTATION DE COMMANDES</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Les namespaces sont souvent utilis<69>s pour repr<70>senter des biblioth<74>ques. Certaines commandes de biblioth<74>que sont utilis<69>es si souvent que c'est une corv<72>e de taper leurs noms qualifi<66>s. Par exemple, supposez que toutes les commandes dans un package comme BLT soient contenues dans un namespace appel<65> <b>Blt</b>. Ensuite vous acc<63>derez <20> ces commandes comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>Blt::graph .g-background red<br>
</b><b>Blt::table . .g 0,0</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Si vous utilisez les commandes <b>graph</b> et <b>table</b> fr<66>quemment, vous pouvez vouloir y acceder sans le pr<70>fixe<b> Blt::</b>. Vous pouvez faire cela en important les commandes dans le namespace courant, comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>namespace import Blt::*</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Ceci ajoute toutes les commandes export<72>es du namespace <b>Blt</b> dans le contexte du namespace courant, donc vous pouvez <20>crire du code comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>graph .g-background red<br>
</b><b>table . .g 0,0</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">La commande <b>namespace import</b> importe seulement des commandes d'un namespace export<72> avec une commande <b>namespace export</b>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Importer <i>toutes</i> les commandes d'un namespace est g<>n<EFBFBD>ralement une mauvaise id<69>e car vous ne savez pas ce que vous r<>cup<75>rez. Il vaut mieux importer juste les commandes sp<73>cifiques dont vous avez besoin. Par exemple, la commande </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>namespace import Blt::graph Blt::table</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">importe seulement les commandes <b>graph</b> et <b>table</b> dans le contexte courant. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Si vous essayez d'importer une commande qui existe d<>j<EFBFBD>, vous aurez une erreur. Ceci vous emp<6D>che d'importer la m<>me commande <20> partir de deux packages diff<66>rent. Mais de temps en temps (peut-<2D>tre en debuggant), vous pouvez vouloir contourner cette restriction. Vous pouvez vouloir relancer la commande <b>namespace import</b> pour profiter de nouvelles commandes qui ont apparu dans un namespace. Dans ce cas, vous pouvez utiliser l'option<b> </b><b>-force</b>, et les commandes existantes seront ecras<61>es silencieusement: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>namespace import-force Blt::graph Blt::table</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Si pour quelque raison, vous voulez cesser d'utiliser les commandes import<72>es, vous pouvez les enlever avec une commande<b> namespace forget</b>, comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>namespace forget Blt::*</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Ceci recherche dans le namespace courant toutes commandes import<72>es de <b>Blt</b>. Si elle en trouve une, elle l'enl<6E>ve. Autrement, elle ne fait rien. Apr<70>s cela, les commandes <b>Blt</b> doivent <20>tre acc<63>d<EFBFBD>es avec le pr<70>fixe<b> Blt::</b>. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Quand vous effacez une commande du namespace exportant comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>rename Blt::graph &quot;&quot;</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">la commande est automatiquement enlev<65>e de tous les namespaces qui l'importaient.
</div><br>
<div><b>EXPORTATION DE COMMANDES</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Vous pouvez exporter des commandes d'un namespace comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>namespace eval Counter &#123;<br>
</b><b>namespace export bump reset<br>
</b><b>variable Num 0<br>
</b><b>variable Max 100<br>
</b><b><br>
</b><b>proc bump &#123;&#123;by 1}} &#123;<br>
</b><b>variable Num<br>
</b><b>incr Num &#36;by<br>
</b><b>Check<br>
</b><b>return &#36;Num<br>
</b><b>}<br>
</b><b>proc reset &#123;} &#123;<br>
</b><b>variable Num<br>
</b><b>set Num 0<br>
</b><b>}<br>
</b><b>proc Check &#123;} &#123;<br>
</b><b>variable Num<br>
</b><b>variable Max<br>
</b><b>if &#123;&#36;Num &gt; &#36;Max} &#123;<br>
</b><b>error &quot;too high!&quot;<br>
</b><b>}<br>
</b><b>}<br>
</b><b>}</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les fonctions <b>bump</b> et <b>reset</b> sont export<72>es, donc elles sont inclues quand vous importez du namespace<b> Counter</b>, comme ceci: </div>
<div ALIGN="LEFT" style="margin-left: 102px;"><b>namespace import Counter::*</b></div>
<div ALIGN="LEFT" style="margin-left: 51px;">N<EFBFBD>anmoins, la fonction <b>Check</b> n'est pas export<72>e, donc elle est ignor<6F>e par les op<6F>rations d'import. </div>
<div ALIGN="LEFT" style="margin-left: 51px;">La commande <b>namespace import</b> importe seulement les commandes qui ont <20>t<EFBFBD> declar<61>s comme export<72>es par leurs namespace. La commande <b>namespace export</b> sp<73>cifie quelles commandes peuvent <20>tre import<72>es par d'autres namespaces. Si une commande <b>namespace </b><b>import</b> sp<73>cifie une commande qui n'est pas export<72>e, la commande n'est pas import<72>e.
</div><br>
<div><b>VOIR EGALEMENT</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;"><A HREF="179.htm">variable</A>(n) </div><br>
<div>Derni<EFBFBD>re r<>vision: 8.0</div><br>
<br>
<br><div ALIGN="CENTER"><A HREF="index.htm"><b>Index</b></A>&nbsp;&nbsp;<A HREF="140.htm"><b>Pr<EFBFBD>c<EFBFBD>dent</b></A>&nbsp;&nbsp;<A HREF="142.htm"><b>Suivant</b></A></div>
</BODY></HTML>