533 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			533 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <HTML><HEAD><TITLE>Tcl Built-In Commands - namespace manual page</TITLE></HEAD><BODY>
 | |
| <DL>
 | |
| <DD><A HREF="namespace.htm#M2" NAME="L733">NAME</A>
 | |
| <DL><DD>namespace - create and manipulate contexts for commands and variables</DL>
 | |
| <DD><A HREF="namespace.htm#M3" NAME="L734">SYNOPSIS</A>
 | |
| <DL>
 | |
| <DD><B>namespace </B>?<I>option</I>? ?<I>arg ...</I>?
 | |
| </DL>
 | |
| <DD><A HREF="namespace.htm#M4" NAME="L735">DESCRIPTION</A>
 | |
| <DL>
 | |
| <DD><A HREF="namespace.htm#M5" NAME="L736"><B>namespace children </B>?<I>namespace</I>? ?<I>pattern</I>?</A>
 | |
| <DD><A HREF="namespace.htm#M6" NAME="L737"><B>namespace code </B><I>script</I></A>
 | |
| <DD><A HREF="namespace.htm#M7" NAME="L738"><B>namespace current</B></A>
 | |
| <DD><A HREF="namespace.htm#M8" NAME="L739"><B>namespace delete </B>?<I>namespace namespace ...</I>?</A>
 | |
| <DD><A HREF="namespace.htm#M9" NAME="L740"><B>namespace eval</B> <I>namespace arg</I> ?<I>arg ...</I>?</A>
 | |
| <DD><A HREF="namespace.htm#M10" NAME="L741"><B>namespace export </B>?-<B>clear</B>? ?<I>pattern pattern ...</I>?</A>
 | |
| <DD><A HREF="namespace.htm#M11" NAME="L742"><B>namespace forget </B>?<I>pattern pattern ...</I>?</A>
 | |
| <DD><A HREF="namespace.htm#M12" NAME="L743"><B>namespace import </B>?<B>-force</B>? ?<I>pattern</I> <I>pattern ...</I>?</A>
 | |
| <DD><A HREF="namespace.htm#M13" NAME="L744"><B>namespace inscope</B> <I>namespace arg</I> ?<I>arg ...</I>?</A>
 | |
| <DD><A HREF="namespace.htm#M14" NAME="L745"><B>namespace origin </B><I>command</I></A>
 | |
| <DD><A HREF="namespace.htm#M15" NAME="L746"><B>namespace parent</B> ?<I>namespace</I>?</A>
 | |
| <DD><A HREF="namespace.htm#M16" NAME="L747"><B>namespace qualifiers</B> <I>string</I></A>
 | |
| <DD><A HREF="namespace.htm#M17" NAME="L748"><B>namespace tail</B> <I>string</I></A>
 | |
| <DD><A HREF="namespace.htm#M18" NAME="L749"><B>namespace which</B> ?-<B>command</B>? ?-<B>variable</B>? <I>name</I></A>
 | |
| </DL>
 | |
| <DD><A HREF="namespace.htm#M19" NAME="L750">WHAT IS A NAMESPACE?</A>
 | |
| <DD><A HREF="namespace.htm#M20" NAME="L751">QUALIFIED NAMES</A>
 | |
| <DD><A HREF="namespace.htm#M21" NAME="L752">NAME RESOLUTION</A>
 | |
| <DD><A HREF="namespace.htm#M22" NAME="L753">IMPORTING COMMANDS</A>
 | |
| <DD><A HREF="namespace.htm#M23" NAME="L754">EXPORTING COMMANDS</A>
 | |
| <DD><A HREF="namespace.htm#M24" NAME="L755">SEE ALSO</A>
 | |
| <DD><A HREF="namespace.htm#M25" NAME="L756">KEYWORDS</A>
 | |
| </DL><HR>
 | |
| <H3><A NAME="M2">NAME</A></H3>
 | |
| namespace - create and manipulate contexts for commands and variables
 | |
| <H3><A NAME="M3">SYNOPSIS</A></H3>
 | |
| <B>namespace </B>?<I>option</I>? ?<I>arg ...</I>?<BR>
 | |
| <H3><A NAME="M4">DESCRIPTION</A></H3>
 | |
| The <B>namespace</B> command lets you create, access, and destroy
 | |
| separate contexts for commands and variables.
 | |
| See the section <B>WHAT IS A NAMESPACE?</B> below
 | |
| for a brief overview of namespaces.
 | |
| The legal <I>option</I>'s are listed below.
 | |
| Note that you can abbreviate the <I>option</I>'s.
 | |
| <P>
 | |
| <DL>
 | |
| <P><DT><A NAME="M5"><B>namespace children </B>?<I>namespace</I>? ?<I>pattern</I>?</A><DD>
 | |
| Returns a list of all child namespaces that belong to the
 | |
| namespace <I>namespace</I>.
 | |
| If <I>namespace</I> is not specified,
 | |
| then the children are returned for the current namespace.
 | |
| This command returns fully-qualified names,
 | |
| which start with <B>::</B>.
 | |
| If the optional <I>pattern</I> is given,
 | |
| then this command returns only the names that match the glob-style pattern.
 | |
| The actual pattern used is determined as follows:
 | |
| a pattern that starts with <B>::</B> is used directly,
 | |
| otherwise the namespace <I>namespace</I>
 | |
| (or the fully-qualified name of the current namespace)
 | |
| is prepended onto the the pattern.
 | |
| <P><DT><A NAME="M6"><B>namespace code </B><I>script</I></A><DD>
 | |
| Captures the current namespace context for later execution
 | |
| of the script <I>script</I>.
 | |
| It returns a new script in which <I>script</I> has been wrapped
 | |
| in a <B>namespace code</B> command.
 | |
| The new script has two important properties.
 | |
| First, it can be evaluated in any namespace and will cause
 | |
| <I>script</I> to be evaluated in the current namespace
 | |
| (the one where the <B>namespace code</B> command was invoked).
 | |
| Second, additional arguments can be appended to the resulting script
 | |
| and they will be passed to <I>script</I> as additional arguments.
 | |
| For example, suppose the command
 | |
| <B>set script [namespace code {foo bar}]</B>
 | |
| is invoked in namespace <B>::a::b</B>.
 | |
| Then <B>eval "$script x y"</B>
 | |
| can be executed in any namespace (assuming the value of
 | |
| <B>script</B> has been passed in properly)
 | |
| and will have the same effect as the command
 | |
| <B>namespace eval ::a::b {foo bar x y}</B>.
 | |
| This command is needed because
 | |
| extensions like Tk normally execute callback scripts
 | |
| in the global namespace.
 | |
| A scoped command captures a command together with its namespace context
 | |
| in a way that allows it to be executed properly later.
 | |
| See the section <B>SCOPED VALUES</B> for some examples
 | |
| of how this is used to create callback scripts.
 | |
| <P><DT><A NAME="M7"><B>namespace current</B></A><DD>
 | |
| Returns the fully-qualified name for the current namespace.
 | |
| The actual name of the global namespace is ``<A HREF="../TkLib/CrtChannel.htm"></A>''
 | |
| (i.e., an empty string),
 | |
| but this command returns <B>::</B> for the global namespace
 | |
| as a convenience to programmers.
 | |
| <P><DT><A NAME="M8"><B>namespace delete </B>?<I>namespace namespace ...</I>?</A><DD>
 | |
| Each namespace <I>namespace</I> is deleted
 | |
| and all variables, procedures, and child namespaces
 | |
| contained in the namespace are deleted.
 | |
| If a procedure is currently executing inside the namespace,
 | |
| the namespace will be kept alive until the procedure returns;
 | |
| however, the namespace is marked to prevent other code from
 | |
| looking it up by name.
 | |
| If a namespace doesn't exist, this command returns an error.
 | |
| If no namespace names are given, this command does nothing.
 | |
| <P><DT><A NAME="M9"><B>namespace eval</B> <I>namespace arg</I> ?<I>arg ...</I>?</A><DD>
 | |
| Activates a namespace called <I>namespace</I> and evaluates some code
 | |
| in that context.
 | |
| If the namespace does not already exist, it is created.
 | |
| If more than one <I>arg</I> argument is specified,
 | |
| the arguments are concatenated together with a space between each one
 | |
| in the same fashion as the <B><A HREF="../TkCmd/eval.htm">eval</A></B> command,
 | |
| and the result is evaluated.
 | |
| <BR>
 | |
| <P>
 | |
| If <I>namespace</I> has leading namespace qualifiers
 | |
| and any leading namespaces do not exist,
 | |
| they are automatically created.
 | |
| <P><DT><A NAME="M10"><B>namespace export </B>?-<B>clear</B>? ?<I>pattern pattern ...</I>?</A><DD>
 | |
| Specifies which commands are exported from a namespace.
 | |
| The exported commands are those that can be later imported
 | |
| into another namespace using a <B>namespace import</B> command.
 | |
| Both commands defined in a namespace and
 | |
| commands the namespace has previously imported
 | |
| can be exported by a namespace.
 | |
| The commands do not have to be defined
 | |
| at the time the <B>namespace export</B> command is executed.
 | |
| Each <I>pattern</I> may contain glob-style special characters,
 | |
| but it may not include any namespace qualifiers.
 | |
| That is, the pattern can only specify commands
 | |
| in the current (exporting) namespace.
 | |
| Each <I>pattern</I> is appended onto the namespace's list of export patterns.
 | |
| If the -<B>clear</B> flag is given,
 | |
| the namespace's export pattern list is reset to empty before any
 | |
| <I>pattern</I> arguments are appended.
 | |
| If no <I>pattern</I>s are given and the -<B>clear</B> flag isn't given,
 | |
| this command returns the namespace's current export list.
 | |
| <P><DT><A NAME="M11"><B>namespace forget </B>?<I>pattern pattern ...</I>?</A><DD>
 | |
| Removes previously imported commands from a namespace.
 | |
| Each <I>pattern</I> is a qualified name such as
 | |
| <B>foo::x</B> or <B>a::b::p*</B>.
 | |
| Qualified names contain <B>::</B>s and qualify a name
 | |
| with the name of one or more namespaces.
 | |
| Each <I>pattern</I> is qualified with the name of an exporting namespace
 | |
| and may have glob-style special characters in the command name
 | |
| at the end of the qualified name.
 | |
| Glob characters may not appear in a namespace name.
 | |
| This command first finds the matching exported commands.
 | |
| It then checks whether any of those those commands
 | |
| were previously imported by the current namespace.
 | |
| If so, this command deletes the corresponding imported commands. 
 | |
| In effect, this un-does the action of a <B>namespace import</B> command.
 | |
| <P><DT><A NAME="M12"><B>namespace import </B>?<B>-force</B>? ?<I>pattern</I> <I>pattern ...</I>?</A><DD>
 | |
| Imports commands into a namespace.
 | |
| Each <I>pattern</I> is a qualified name like
 | |
| <B>foo::x</B> or <B>a::p*</B>.
 | |
| That is, it includes the name of an exporting namespace
 | |
| and may have glob-style special characters in the command name
 | |
| at the end of the qualified name.
 | |
| Glob characters may not appear in a namespace name.
 | |
| All the commands that match a <I>pattern</I> string
 | |
| and which are currently exported from their namespace
 | |
| are added to the current namespace.
 | |
| This is done by creating a new command in the current namespace
 | |
| that points to the exported command in its original namespace;
 | |
| when the new imported command is called, it invokes the exported command.
 | |
| This command normally returns an error
 | |
| if an imported command conflicts with an existing command.
 | |
| However, if the -<B>force</B> option is given,
 | |
| imported commands will silently replace existing commands.
 | |
| The <B>namespace import</B> command has snapshot semantics:
 | |
| that is, only requested commands that are currently defined
 | |
| in the exporting namespace are imported.
 | |
| In other words, you can import only the commands that are in a namespace
 | |
| at the time when the <B>namespace import</B> command is executed.
 | |
| If another command is defined and exported in this namespace later on,
 | |
| it will not be imported.
 | |
| <P><DT><A NAME="M13"><B>namespace inscope</B> <I>namespace arg</I> ?<I>arg ...</I>?</A><DD>
 | |
| Executes a script in the context of a particular namespace.
 | |
| This command is not expected to be used directly by programmers;
 | |
| calls to it are generated implicitly when applications
 | |
| use <B>namespace code</B> commands to create callback scripts
 | |
| that the applications then register with, e.g., Tk widgets.
 | |
| The <B>namespace inscope</B> command is much like the <B>namespace eval</B>
 | |
| command except that it has <B><A HREF="../TkCmd/lappend.htm">lappend</A></B> semantics
 | |
| and the namespace must already exist.
 | |
| It treats the first argument as a list,
 | |
| and appends any arguments after the first
 | |
| onto the end as proper list elements.
 | |
| <B>namespace inscope ::foo a x y z</B>
 | |
| is equivalent to
 | |
| <B>namespace eval ::foo [concat a [list x y z]]</B>
 | |
| This <B><A HREF="../TkCmd/lappend.htm">lappend</A></B> semantics is important because many callback scripts
 | |
| are actually prefixes.
 | |
| <P><DT><A NAME="M14"><B>namespace origin </B><I>command</I></A><DD>
 | |
| Returns the fully-qualified name of the original command
 | |
| to which the imported command <I>command</I> refers.
 | |
| When a command is imported into a namespace,
 | |
| a new command is created in that namespace
 | |
| that points to the actual command in the exporting namespace.
 | |
| If a command is imported into a sequence of namespaces
 | |
| <I>a, b,...,n</I> where each successive namespace
 | |
| just imports the command from the previous namespace,
 | |
| this command returns the fully-qualified name of the original command
 | |
| in the first namespace, <I>a</I>.
 | |
| If <I>command</I> does not refer to an imported command,
 | |
| the command's own fully-qualified name is returned.
 | |
| <P><DT><A NAME="M15"><B>namespace parent</B> ?<I>namespace</I>?</A><DD>
 | |
| Returns the fully-qualified name of the parent namespace
 | |
| for namespace <I>namespace</I>.
 | |
| If <I>namespace</I> is not specified,
 | |
| the fully-qualified name of the current namespace's parent is returned.
 | |
| <P><DT><A NAME="M16"><B>namespace qualifiers</B> <I>string</I></A><DD>
 | |
| Returns any leading namespace qualifiers for <I>string</I>.
 | |
| Qualifiers are namespace names separated by <B>::</B>s.
 | |
| For the <I>string</I> <B>::foo::bar::x</B>,
 | |
| this command returns <B>::foo::bar</B>,
 | |
| and for <B>::</B> it returns an empty string.
 | |
| This command is the complement of the <B>namespace tail</B> command.
 | |
| Note that it does not check whether the
 | |
| namespace names are, in fact,
 | |
| the names of currently defined namespaces.
 | |
| <P><DT><A NAME="M17"><B>namespace tail</B> <I>string</I></A><DD>
 | |
| Returns the simple name at the end of a qualified string.
 | |
| Qualifiers are namespace names separated by <B>::</B>s.
 | |
| For the <I>string</I> <B>::foo::bar::x</B>,
 | |
| this command returns <B>x</B>,
 | |
| and for <B>::</B> it returns an empty string.
 | |
| This command is the complement of the <B>namespace qualifiers</B> command.
 | |
| It does not check whether the namespace names are, in fact,
 | |
| the names of currently defined namespaces.
 | |
| <P><DT><A NAME="M18"><B>namespace which</B> ?-<B>command</B>? ?-<B>variable</B>? <I>name</I></A><DD>
 | |
| Looks up <I>name</I> as either a command or variable
 | |
| and returns its fully-qualified name.
 | |
| For example, if <I>name</I> does not exist in the current namespace
 | |
| but does exist in the global namespace,
 | |
| this command returns a fully-qualified name in the global namespace.
 | |
| If the command or variable does not exist,
 | |
| this command returns an empty string.  If the variable has been
 | |
| created but not defined, such as with the <B><A HREF="../TkCmd/variable.htm">variable</A></B> command
 | |
| or through a <B><A HREF="../TkCmd/trace.htm">trace</A></B> on the variable, this command will return the 
 | |
| fully-qualified name of the variable.
 | |
| If no flag is given, <I>name</I> is treated as a command name.
 | |
| See the section <B>NAME RESOLUTION</B> below for an explanation of
 | |
| the rules regarding name resolution.
 | |
| 
 | |
| <P></DL>
 | |
| <H3><A NAME="M19">WHAT IS A NAMESPACE?</A></H3>
 | |
| A namespace is a collection of commands and variables.
 | |
| It encapsulates the commands and variables to ensure that they
 | |
| won't interfere with the commands and variables of other namespaces.
 | |
| Tcl has always had one such collection,
 | |
| which we refer to as the <I>global namespace</I>.
 | |
| The global namespace holds all global variables and commands.
 | |
| The <B>namespace eval</B> command lets you create new namespaces.
 | |
| For example,
 | |
| <PRE><B>namespace eval Counter {
 | |
|     namespace export bump
 | |
|     variable num 0
 | |
| 
 | |
|     proc bump {} {
 | |
|         variable num
 | |
|         incr num
 | |
|     }
 | |
| }</B></PRE>
 | |
| creates a new namespace containing the variable <B>num</B> and
 | |
| the procedure <B>bump</B>.
 | |
| The commands and variables in this namespace are separate from
 | |
| other commands and variables in the same program.
 | |
| If there is a command named <B>bump</B> in the global namespace,
 | |
| for example, it will be different from the command <B>bump</B>
 | |
| in the <B>Counter</B> namespace.
 | |
| <P>
 | |
| Namespace variables resemble global variables in Tcl.
 | |
| They exist outside of the procedures in a namespace
 | |
| but can be accessed in a procedure via the <B><A HREF="../TkCmd/variable.htm">variable</A></B> command,
 | |
| as shown in the example above.
 | |
| <P>
 | |
| Namespaces are dynamic.
 | |
| You can add and delete commands and variables at any time,
 | |
| so you can build up the contents of a
 | |
| namespace over time using a series of <B>namespace eval</B> commands.
 | |
| For example, the following series of commands has the same effect
 | |
| as the namespace definition shown above:
 | |
| <PRE><B>namespace eval Counter {
 | |
|     variable num 0
 | |
|     proc bump {} {
 | |
|         variable num
 | |
|         return [incr num]
 | |
|     }
 | |
| }
 | |
| namespace eval Counter {
 | |
|     proc test {args} {
 | |
|         return $args
 | |
|     }
 | |
| }
 | |
| namespace eval Counter {
 | |
|     rename test ""
 | |
| }</B></PRE>
 | |
| Note that the <B>test</B> procedure is added to the <B>Counter</B> namespace,
 | |
| and later removed via the <B><A HREF="../TkCmd/rename.htm">rename</A></B> command.
 | |
| <P>
 | |
| Namespaces can have other namespaces within them,
 | |
| so they nest hierarchically.
 | |
| A nested namespace is encapsulated inside its parent namespace
 | |
| and can not interfere with other namespaces.
 | |
| 
 | |
| <H3><A NAME="M20">QUALIFIED NAMES</A></H3>
 | |
| Each namespace has a textual name such as
 | |
| <B><A HREF="../TkCmd/history.htm">history</A></B> or <B>::safe::interp</B>.
 | |
| Since namespaces may nest,
 | |
| qualified names are used to refer to
 | |
| commands, variables, and child namespaces contained inside namespaces.
 | |
| Qualified names are similar to the hierarchical path names for
 | |
| Unix files or Tk widgets,
 | |
| except that <B>::</B> is used as the separator
 | |
| instead of <B>/</B> or <B>.</B>.
 | |
| The topmost or global namespace has the name ``<A HREF="../TkLib/CrtChannel.htm"></A>'' (i.e., an empty string),
 | |
| although <B>::</B> is a synonym.
 | |
| As an example, the name <B>::safe::interp::create</B>
 | |
| refers to the command <B>create</B> in the namespace <B><A HREF="../TkCmd/interp.htm">interp</A></B>
 | |
| that is a child of of namespace <B>::safe</B>,
 | |
| which in turn is a child of the global namespace <B>::</B>.
 | |
| <P>
 | |
| If you want to access commands and variables from another namespace,
 | |
| you must use some extra syntax.
 | |
| Names must be qualified by the namespace that contains them.
 | |
| From the global namespace,
 | |
| we might access the <B>Counter</B> procedures like this:
 | |
| <PRE><B>Counter::bump 5
 | |
| Counter::Reset</B></PRE>
 | |
| We could access the current count like this:
 | |
| <PRE><B>puts "count = $Counter::num"</B></PRE>
 | |
| When one namespace contains another, you may need more than one
 | |
| qualifier to reach its elements.
 | |
| If we had a namespace <B>Foo</B> that contained the namespace <B>Counter</B>,
 | |
| you could invoke its <B>bump</B> procedure
 | |
| from the global namespace like this:
 | |
| <PRE><B>Foo::Counter::bump 3</B></PRE>
 | |
| <P>
 | |
| You can also use qualified names when you create and rename commands.
 | |
| For example, you could add a procedure to the <B>Foo</B>
 | |
| namespace like this:
 | |
| <PRE><B>proc Foo::Test {args} {return $args}</B></PRE>
 | |
| And you could move the same procedure to another namespace like this:
 | |
| <PRE><B>rename Foo::Test Bar::Test</B></PRE>
 | |
| <P>
 | |
| There are a few remaining points about qualified names
 | |
| that we should cover.
 | |
| Namespaces have nonempty names except for the global namespace.
 | |
| <B>::</B> is disallowed in simple command, variable, and namespace names
 | |
| except as a namespace separator.
 | |
| Extra <B>:</B>s in a qualified name are ignored;
 | |
| that is, two or more <B>:</B>s are treated as a namespace separator.
 | |
| A trailing <B>::</B> in a qualified variable or command name
 | |
| refers to the variable or command named {}.
 | |
| However, a trailing <B>::</B> in a qualified namespace name is ignored.
 | |
| 
 | |
| <H3><A NAME="M21">NAME RESOLUTION</A></H3>
 | |
| In general, all Tcl commands that take variable and command names
 | |
| support qualified names.
 | |
| This means you can give qualified names to such commands as
 | |
| <B><A HREF="../TkCmd/set.htm">set</A></B>, <B><A HREF="../TkCmd/proc.htm">proc</A></B>, <B><A HREF="../TkCmd/rename.htm">rename</A></B>, and <B><A HREF="../TkCmd/interp.htm">interp alias</A></B>.
 | |
| If you provide a fully-qualified name that starts with a <B>::</B>,
 | |
| there is no question about what command, variable, or namespace
 | |
| you mean.
 | |
| However, if the name does not start with a <B>::</B>
 | |
| (i.e., is <I>relative</I>), 
 | |
| Tcl follows a fixed rule for looking it up:
 | |
| Command and variable names are always resolved
 | |
| by looking first in the current namespace,
 | |
| and then in the global namespace.
 | |
| Namespace names, on the other hand, are always resolved
 | |
| by looking in only the current namespace.
 | |
| <P>
 | |
| In the following example,
 | |
| <PRE><B>set traceLevel 0
 | |
| namespace eval Debug {
 | |
|     printTrace $traceLevel
 | |
| }</B></PRE>
 | |
| Tcl looks for <B>traceLevel</B> in the namespace <B>Debug</B>
 | |
| and then in the global namespace.
 | |
| It looks up the command <B>printTrace</B> in the same way.
 | |
| If a variable or command name is not found in either context,
 | |
| the name is undefined.
 | |
| To make this point absolutely clear, consider the following example:
 | |
| <PRE><B>set traceLevel 0
 | |
| namespace eval Foo {
 | |
|     variable traceLevel 3
 | |
| 
 | |
|     namespace eval Debug {
 | |
|         printTrace $traceLevel
 | |
|     }
 | |
| }</B></PRE>
 | |
| Here Tcl looks for <B>traceLevel</B> first in the namespace <B>Foo::Debug</B>.
 | |
| Since it is not found there, Tcl then looks for it 
 | |
| in the global namespace.
 | |
| The variable <B>Foo::traceLevel</B> is completely ignored
 | |
| during the name resolution process.
 | |
| <P>
 | |
| You can use the <B>namespace which</B> command to clear up any question
 | |
| about name resolution.
 | |
| For example, the command:
 | |
| <PRE><B>namespace eval Foo::Debug {namespace which -variable traceLevel}</B></PRE>
 | |
| returns <B>::traceLevel</B>.
 | |
| On the other hand, the command,
 | |
| <PRE><B>namespace eval Foo {namespace which -variable traceLevel}</B></PRE>
 | |
| returns <B>::Foo::traceLevel</B>.
 | |
| <P>
 | |
| As mentioned above,
 | |
| namespace names are looked up differently
 | |
| than the names of variables and commands.
 | |
| Namespace names are always resolved in the current namespace.
 | |
| This means, for example,
 | |
| that a <B>namespace eval</B> command that creates a new namespace
 | |
| always creates a child of the current namespace
 | |
| unless the new namespace name begins with a <B>::</B>.
 | |
| <P>
 | |
| Tcl has no access control to limit what variables, commands,
 | |
| or namespaces you can reference.
 | |
| If you provide a qualified name that resolves to an element
 | |
| by the name resolution rule above,
 | |
| you can access the element.
 | |
| <P>
 | |
| You can access a namespace variable
 | |
| from a procedure in the same namespace
 | |
| by using the <B><A HREF="../TkCmd/variable.htm">variable</A></B> command.
 | |
| Much like the <B><A HREF="../TkCmd/global.htm">global</A></B> command,
 | |
| this creates a local link to the namespace variable.
 | |
| If necessary, it also creates the variable in the current namespace
 | |
| and initializes it.
 | |
| Note that the <B><A HREF="../TkCmd/global.htm">global</A></B> command only creates links
 | |
| to variables in the global namespace.
 | |
| It is not necessary to use a <B><A HREF="../TkCmd/variable.htm">variable</A></B> command
 | |
| if you always refer to the namespace variable using an
 | |
| appropriate qualified name.
 | |
| 
 | |
| <H3><A NAME="M22">IMPORTING COMMANDS</A></H3>
 | |
| Namespaces are often used to represent libraries.
 | |
| Some library commands are used so frequently
 | |
| that it is a nuisance to type their qualified names.
 | |
| For example, suppose that all of the commands in a package
 | |
| like BLT are contained in a namespace called <B>Blt</B>.
 | |
| Then you might access these commands like this:
 | |
| <PRE><B>Blt::graph .g -background red
 | |
| Blt::table . .g 0,0</B></PRE>
 | |
| If you use the <B>graph</B> and <B>table</B> commands frequently,
 | |
| you may want to access them without the <B>Blt::</B> prefix.
 | |
| You can do this by importing the commands into the current namespace,
 | |
| like this:
 | |
| <PRE><B>namespace import Blt::*</B></PRE>
 | |
| This adds all exported commands from the <B>Blt</B> namespace
 | |
| into the current namespace context, so you can write code like this:
 | |
| <PRE><B>graph .g -background red
 | |
| table . .g 0,0</B></PRE>
 | |
| The <B>namespace import</B> command only imports commands
 | |
| from a namespace that that namespace exported
 | |
| with a <B>namespace export</B> command.
 | |
| <P>
 | |
| Importing <I>every</I> command from a namespace is generally
 | |
| a bad idea since you don't know what you will get.
 | |
| It is better to import just the specific commands you need.
 | |
| For example, the command
 | |
| <PRE><B>namespace import Blt::graph Blt::table</B></PRE>
 | |
| imports only the <B>graph</B> and <B>table</B> commands into the
 | |
| current context.
 | |
| <P>
 | |
| If you try to import a command that already exists, you will get an
 | |
| error.  This prevents you from importing the same command from two
 | |
| different packages.  But from time to time (perhaps when debugging),
 | |
| you may want to get around this restriction.  You may want to
 | |
| reissue the <B>namespace import</B> command to pick up new commands
 | |
| that have appeared in a namespace.  In that case, you can use the
 | |
| <B>-force</B> option, and existing commands will be silently overwritten:
 | |
| <PRE><B>namespace import -force Blt::graph Blt::table</B></PRE>
 | |
| If for some reason, you want to stop using the imported commands,
 | |
| you can remove them with an <B>namespace forget</B> command, like this:
 | |
| <PRE><B>namespace forget Blt::*</B></PRE>
 | |
| This searches the current namespace for any commands imported from <B>Blt</B>.
 | |
| If it finds any, it removes them.  Otherwise, it does nothing.
 | |
| After this, the <B>Blt</B> commands must be accessed with the <B>Blt::</B>
 | |
| prefix.
 | |
| <P>
 | |
| When you delete a command from the exporting namespace like this:
 | |
| <PRE><B>rename Blt::graph ""</B></PRE>
 | |
| the command is automatically removed from all namespaces that import it.
 | |
| 
 | |
| <H3><A NAME="M23">EXPORTING COMMANDS</A></H3>
 | |
| You can export commands from a namespace like this:
 | |
| <PRE><B>namespace eval Counter {
 | |
|     namespace export bump reset
 | |
|     variable Num 0
 | |
|     variable Max 100
 | |
| 
 | |
|     proc bump {{by 1}} {
 | |
|         variable Num
 | |
|         incr Num $by
 | |
|         Check
 | |
|         return $Num
 | |
|     }
 | |
|     proc reset {} {
 | |
|         variable Num
 | |
|         set Num 0
 | |
|     }
 | |
|     proc Check {} {
 | |
|         variable Num
 | |
|         variable Max
 | |
|         if {$Num > $Max} {
 | |
|             error "too high!"
 | |
|         }
 | |
|     }
 | |
| }</B></PRE>
 | |
| The procedures <B>bump</B> and <B>reset</B> are exported,
 | |
| so they are included when you import from the <B>Counter</B> namespace,
 | |
| like this:
 | |
| <PRE><B>namespace import Counter::*</B></PRE>
 | |
| However, the <B>Check</B> procedure is not exported,
 | |
| so it is ignored by the import operation.
 | |
| <P>
 | |
| The <B>namespace import</B> command only imports commands
 | |
| that were declared as exported by their namespace.
 | |
| The <B>namespace export</B> command specifies what commands
 | |
| may be imported by other namespaces.
 | |
| If a <B>namespace import</B> command specifies a command
 | |
| that is not exported, the command is not imported.
 | |
| 
 | |
| <H3><A NAME="M24">SEE ALSO</A></H3>
 | |
| <B><A HREF="../TkCmd/variable.htm">variable</A></B>
 | |
| <H3><A NAME="M25">KEYWORDS</A></H3>
 | |
| <A href="../Keywords/E.htm#exported">exported</A>, <A href="../Keywords/I.htm#internal">internal</A>, <A href="../Keywords/V.htm#variable">variable</A>
 | |
| <HR><PRE>
 | |
| <A HREF="../copyright.htm">Copyright</A> © 1993-1997 Bell Labs Innovations for Lucent Technologies
 | |
| <A HREF="../copyright.htm">Copyright</A> © 1997 Sun Microsystems, Inc.
 | |
| <A HREF="../copyright.htm">Copyright</A> © 1995-1997 Roger E. Critchlow Jr.</PRE>
 | |
| </BODY></HTML>
 | 
