## Tcl8.6.17/Tk8.6.17 Documentation > Tcl Commands > namespace

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

  NAME
    namespace — 命令と変数の為の文脈の生成と操作 create and manipulate contexts for commands and variables
  構文 SYNOPSIS
  説明 DESCRIPTION
    namespace children ?namespace? ?pattern?
    namespace code script
    namespace current
    namespace delete ?namespace namespace ...?
    namespace ensemble subcommand ?arg ...?
    namespace eval namespace arg ?arg ...?
    namespace exists namespace
    namespace export ?-clear? ?pattern pattern ...?
    namespace forget ?pattern pattern ...?
    namespace import ?-force? ?pattern pattern ...?
    namespace inscope namespace script ?arg ...?
    namespace origin command
    namespace parent ?namespace?
    namespace path ?namespaceList?
    namespace qualifiers string
    namespace tail string
    namespace upvar namespace ?otherVar myVar ...?
    namespace unknown ?script?
    namespace which ?-command? ?-variable? name
  WHAT IS A NAMESPACE?
  修飾された名前 QUALIFIED NAMES
  NAME RESOLUTION
  命令の移入 IMPORTING COMMANDS
  命令の移出 EXPORTING COMMANDS
  SCOPED SCRIPTS
  ENSEMBLES
    namespace ensemble create ?option value ...?
    namespace ensemble configure command ?option? ?value ...?
    namespace ensemble exists command
  ENSEMBLE OPTIONS
    -map
    -parameters
    -prefixes
    -subcommands
    -unknown
    -command
    -namespace
  UNKNOWN HANDLER BEHAVIOUR
  用例 EXAMPLES
  SEE ALSO
  KEYWORDS

### NAME

namespace — 命令と変数の為の文脈の生成と操作 create and manipulate contexts for commands and variables

### 構文 SYNOPSIS

namespace subcommand ?arg ...?

### 説明 DESCRIPTION

この namespace 命令は使用者に命令と変数の為に別離した文脈を生成させ､利用させ､遺棄させる｡名前空間の概要については､下の WHAT IS A NAMESPACE? の節を参照されたい｡ subcommand の適切な値は下に列挙した｡註意すべきは subcommand の短縮形が可能なことである｡ The namespace command lets you create, access, and destroy separate contexts for commands and variables. See the section WHAT IS A NAMESPACE? below for a brief overview of namespaces. The legal values of subcommand are listed below. Note that you can abbreviate the subcommands.

namespace children ?namespace? ?pattern?
  名前空間 namespace に 属する全ての子供の名前空間のリストを返す｡もし､namespace が指定されないと､現在の名前空間の子供が返される｡この命令は､完全に修飾された､二重のコロン(::)に始まる名前を返す｡もし､任意追加の pattern が与えれると､この命令は､展開形式で模様に合致する名前のみを返す｡実際に使用される模様は次のように決定される: 二重のコロン(::)に始まる模様が直接使用され､それ以外の場合､名前空間 namespace (又は､完全に修飾された現在の名前空間)が模様の先頭に付く｡ Returns a list of all child namespaces that belong to the namespace namespace. If namespace is not specified, then the children are returned for the current namespace. This command returns fully-qualified names, which start with a double colon (::). If the optional pattern 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 double colon (::) is used directly, otherwise the namespace namespace (or the fully-qualified name of the current namespace) is prepended onto the pattern.

namespace code script
  後の記述譜 script の実行の為に､現在の名前空間の文脈を捕捉する｡ script が namespace inscope 命令の中に包まれた新しい記述譜を返す｡その新しい記述譜は二つの重要な性質を有する｡第１は､それはどの名前空間内でも評価可能であり､現在の名前空間内で script が評価される原因になる(そこで､ namespace inscope 命令が起動される所の一つ)｡第２に､結果の記述譜に､追加的な引数が追記可能で､ script に追加的な引数として渡される｡譬えば､命令 set script [namespace code {foo bar}] が名前空間 ::a::b 内で起動されたと仮定する｡次いで､ eval $script [list x y] は､如何なる名前空間内でも実行可能であり( script の値が適切に渡されることを仮定している)､それは､命令 ::namespace eval ::a::b {foo bar x y} と同じ効果を有することになる｡この命令は､Tkの様な拡張が､通常､大域名前空間中で回収記述譜を実行するので必要になる｡有効範囲を定めた命令は､命令と､その名前空間の文脈とを､後に適切に実行される事を許容する様な方法で､共に捕捉する｡回収の記述譜を作る為に如何に使用するかの幾つかの例は SCOPED SCRIPTS の節を参照されたい｡ Captures the current namespace context for later execution of the script script. It returns a new script in which script has been wrapped in a namespace inscope command. The new script has two important properties. First, it can be evaluated in any namespace and will cause script to be evaluated in the current namespace (the one where the namespace code command was invoked). Second, additional arguments can be appended to the resulting script and they will be passed to script as additional arguments. For example, suppose the command set script [namespace code {foo bar}] is invoked in namespace ::a::b. Then eval $script [list x y] can be executed in any namespace (assuming the value of script has been passed in properly) and will have the same effect as the command ::namespace eval ::a::b {foo bar x y}. 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 SCOPED SCRIPTS for some examples of how this is used to create callback scripts.

namespace current
  現在の名前空間についての､完全に修飾された名前を返す｡大域名前空間の本当の名前は “” (即ち､空文字列)であるが､この命令は､大域名前空間については､プログラムの作り手の便宜をはかり :: を返す｡ Returns the fully-qualified name for the current namespace. The actual name of the global namespace is “” (i.e., an empty string), but this command returns :: for the global namespace as a convenience to programmers.

namespace delete ?namespace namespace ...?
  それぞれの名前空間 namespace が削除され､その名前空間内の､全ての変数､手続函数､子供の名前空間が削除される｡もし､その名前空間内で手続函数が現在実行中であると､その名前空間は､手続函数が返って来るまで存続して保たれるが; その名前空間は他の命令からは名前が見えない様に印が付けられる｡もし名前空間が存在しないと､この命令は不都合を返す｡もし､どの名前空間も与えられないと､この命令は何もしない｡ Each namespace namespace 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 does not exist, this command returns an error. If no namespace names are given, this command does nothing.

namespace ensemble subcommand ?arg ...?
  副命令の集合の外で命令を生成し操作する命令｡詳細は下の ENSEMBLES の節を参照されたい｡ Creates and manipulates a command that is formed out of an ensemble of subcommands. See the section ENSEMBLES below for further details.

namespace eval namespace arg ?arg ...?
  namespace と呼ばれる名前空間を有効にして､その文脈の中で､幾つかの命令符号を評価する｡もし､名前空間が未だに実在しなかったら､それを生成する｡もし､一つ以上の arg 引数が指定されていると､それらの引数は､ eval 命令と同じ方式で､それぞれの間が空白で互に繋がれ､次に､出来た結果が評価される｡ Activates a namespace called namespace and evaluates some code in that context. If the namespace does not already exist, it is created. If more than one arg argument is specified, the arguments are concatenated together with a space between each one in the same fashion as the eval command, and the result is evaluated.

  もし､ namespace が名前空間修飾子を頭に冠していて､付いているどの名前空間も実在しないならば､それが自動的に生成される｡ If namespace has leading namespace qualifiers and any leading namespaces do not exist, they are automatically created.

namespace exists namespace
  もし､ namespace が現在の文脈内で適正な名前空間であれば 1 ､でなければ 0 を返す｡ Returns 1 if namespace is a valid namespace in the current context, returns 0 otherwise.

namespace export ?-clear? ?pattern pattern ...?
  名前空間からどの命令が移送されるかを指定する｡移送される命令は､後程､他の名前空間に namespace import 命令を使って移送可能なものである｡名前空間内で定義された命令と名前空間が予め移入した命令の両方供､名前空間によって移送可能である｡この命令は､ namespace export 命令が実行された時点には､定義されている必要はない｡それぞれの模様は､展開形式の特別な記号を含んでいても好いが､如何なる名前空間修飾子も含んではならない｡即ち､その模様は現在の(移送している)名前空間内の命令のみを規定できる｡それぞれの pattern は､その上に移送した名前空間の模様のリストを追加されている｡もし､ -clear 旗標が与えられると､その名前空間の移送した模様は､どの pattern 引数も追加される前に空に組み直される｡もし､ pattern が何も与えられず､ -clear 旗標も与えられないと､この命令は名前空間の現在の移送リストを返す｡ Specifies which commands are exported from a namespace. The exported commands are those that can be later imported into another namespace using a namespace import 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 namespace export command is executed. Each pattern 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 pattern is appended onto the namespace's list of export patterns. If the -clear flag is given, the namespace's export pattern list is reset to empty before any pattern arguments are appended. If no patterns are given and the -clear flag is not given, this command returns the namespace's current export list.

namespace forget ?pattern pattern ...?
  名前空間から以前に移入した命令を取除く｡それぞれの pattern は恰も x か foo::x か a::b::p* の如く､単純か修飾された名前である｡修飾名は二重コロン(::)を含んでいて､一つ又はそれ以上の名前空間の名前で名前を修飾する｡それぞれの､ “修飾した模様” は移入された名前空間の名前で修飾され､修飾された名前の末尾の命令名内に展開形式の特別な文字を有するかもしれない｡展開式文字は名前空間の名前の中に現れてはならない｡この命令は､それぞれの “単純な模様” に合致する様な､現在の名前空間の命令で､異なる名前空間から移入したものを削除する｡この命令は､それぞれの “修飾された模様” に合致する様な､移入した命令を最初に捜す｡次に､この内のどの命令が､現在の名前空間によって以前に移入されたのかを検査する｡もし､該当すれば､相当する移入された命令を削除する｡要するに､これは namespace import 命令の動作の取消しをする｡ Removes previously imported commands from a namespace. Each pattern is a simple or qualified name such as x, foo::x or a::b::p*. Qualified names contain double colons (::) and qualify a name with the name of one or more namespaces. Each “qualified pattern” 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. For each “simple pattern” this command deletes the matching commands of the current namespace that were imported from a different namespace. For “qualified patterns”, this command first finds the matching exported commands. It then checks whether any of those commands were previously imported by the current namespace. If so, this command deletes the corresponding imported commands. In effect, this undoes the action of a namespace import command.

namespace import ?-force? ?pattern pattern ...?
  命令を名前空間に移入するか､名前空間内に移入された命令の組を問合せる｡引数が存在しないと､ namespace import は､現在の名前空間内の､異なる名前空間から移入された命令のリストを返す｡返ってきたリスト内の命令は単純な名前の形式で､名前空間の修飾子は全く付いていない｡この書式は､ namespace forget との組合せに適している(下の使用例を参照されたい)｡ Imports commands into a namespace, or queries the set of imported commands in a namespace. When no arguments are present, namespace import returns the list of commands in the current namespace that have been imported from other namespaces. The commands in the returned list are in the format of simple names, with no namespace qualifiers at all. This format is suitable for composition with namespace forget (see EXAMPLES below).

  引数 pattern が存在する場合､それぞれの pattern は foo::x や a::p* の様な修飾された名前である｡即ち､移送する名前空間の名前を含み､修飾された名前の末尾に命令の名前の展開形式の特別な文字が入っても好い｡展開形式の文字は名前空間の名前の中に現れてはならない｡名前空間の名前が完全には修飾されていない時(即ち､名前空間の区切りで始まっていない)､ NAME RESOLUTION 節に記述された方法で名前空間の名前として決定される; その名前の名前空間が見付らない場合は不具合になる｡ When pattern arguments are present, each pattern is a qualified name like foo::x or a::p*. 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. When the namespace name is not fully qualified (i.e., does not start with a namespace separator) it is resolved as a namespace name in the way described in the NAME RESOLUTION section; it is an error if no namespace with that name can be found.

  pattern 文字列に合致し､且つ､現在､その名前空間から移送される全ての命令が､現在の名前空間に追加される｡それは､現在の名前空間に､移入された､その元の名前空間を指し示している､新しい命令を生成することで達成される; 新しく移入された命令が起動される時､それが､その移出された命令を起動する｡もし､移入された命令が既存の命令と重複していると､この命令は不具合を返す｡しかし､ -force 指示項目が与えられると､移入された命令は､重複警告の報告なしに､既存の命令に置換わる｡ namespace import 命令は､意味の抽出機能を有する: 即ち､要求された命令の内､現在移出された名前空間内で定義されたものだけが移入される｡言い換えると､namespace import 命令が実行されている時に名前空間内にある命令だけが移入される｡もし後に､別の命令が､この名前空間内で定義され移出されても､それは移入されない｡ All the commands that match a pattern 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 -force option is given, imported commands will silently replace existing commands. The namespace import 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 namespace import command is executed. If another command is defined and exported in this namespace later on, it will not be imported.

namespace inscope namespace script ?arg ...?
  指定した namespace の文脈内で記述譜を実行する｡この命令は､算譜作成者によって直接使われることを予期していない; この呼出は､応用譜の中で､やがては､Tk部品等等とかと､一緒に登録することになる様な､回収の記述譜を生成する為の namespace code 命令を使用する時に､暗黙の内に発生する｡この namespace inscope 命令は namespace が既に実在しなくてはならないこと､及び､ namespace inscope は追加的な arg を適切なリストとして追加することとを除いて､namespace eval 命令と良く似ている｡ Executes a script in the context of the specified namespace. This command is not expected to be used directly by programmers; calls to it are generated implicitly when applications use namespace code commands to create callback scripts that the applications then register with, e.g., Tk widgets. The namespace inscope command is much like the namespace eval command except that the namespace must already exist, and namespace inscope appends additional args as proper list elements.

      namespace inscope ::foo $script $x $y $z

  は､次のものと等価である is equivalent to

      namespace eval ::foo [concat $script [list $x $y $z]]

  即ち､ namespace eval の場合と同じ様に､追加的な引数は､第２回目の置換を実行することはない｡ thus additional arguments will not undergo a second round of substitution, as is the case with namespace eval.

namespace origin command
  移入された命令 command を参照している元の命令の完全に修飾された名前を返す｡命令が名前空間内に移入される時､新しい命令が名前空間内に生成され､それが､移出している名前空間中の実際の命令を指し示している｡もし､命令が継続した名前空間､ a, b,...,n の中に移入されると､ここで､継続したそれぞれの名前空間は､丁度命令をその前の名前空間から移入していることを表しているとして､この命令は第１の名前空間a の元の命令の完全に修飾された名前を返す｡もし command が移入された命令を参照していないとき､この命令自身の完全に修飾された名前が返る｡ Returns the fully-qualified name of the original command to which the imported command command 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 a, b,...,n 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, a. If command does not refer to an imported command, the command's own fully-qualified name is returned.

namespace parent ?namespace?
  名前空間 namespace の親の名前空間の完全に修飾された名前を返す｡もし namespace が指定されないと現在の名前空間の親の名前空間の完全に修飾された名前を返す｡ Returns the fully-qualified name of the parent namespace for namespace namespace. If namespace is not specified, the fully-qualified name of the current namespace's parent is returned.

namespace path ?namespaceList?
  現在の名前空間の命令の経路の決定結果を返す｡もし､namespaceList が名前空間の名前のリストとして指定されると､現在の名前空間の命令の経路の決定結果がそのような名前空間を設定し､空リストを返す｡省略時設定の命令の経路決定結果は常に空である｡名前決定に関する規則の説明は下の NAME RESOLUTION の節を参照されたい｡ Returns the command resolution path of the current namespace. If namespaceList is specified as a list of named namespaces, the current namespace's command resolution path is set to those namespaces and returns the empty list. The default command resolution path is always empty. See the section NAME RESOLUTION below for an explanation of the rules regarding name resolution.

namespace qualifiers string
  何であれ string の頭に冠した名前空間修飾子を返す｡修飾子は二重コロン(::)で区切られている｡この命令は string の::foo::bar::x については､::foo::bar を返し､:: については空文字列を返す｡この命令は namespace tail 命令と相補的である｡註意すべきは､この命令は名前空間の名前が､実際に現在､名前空間により定義された名前であるかないかを試験しない｡ Returns any leading namespace qualifiers for string. Qualifiers are namespace names separated by double colons (::). For the string ::foo::bar::x, this command returns ::foo::bar, and for :: it returns an empty string. This command is the complement of the namespace tail command. Note that it does not check whether the namespace names are, in fact, the names of currently defined namespaces.

namespace tail string
  修飾された string の末尾の単純な名前を返す｡修飾子は二重コロン(::)で区切られた名前空間の名前である｡string として ::foo::bar::x からは x を返し､:: からは空文字列を返す｡この命令は namespace qualifiers 命令と相補的である｡註意すべきは､この命令は名前空間の名前が､実際に現在､名前空間により定義された名前であるかないかを試験しない｡ Returns the simple name at the end of a qualified string. Qualifiers are namespace names separated by double colons (::). For the string ::foo::bar::x, this command returns x, and for :: it returns an empty string. This command is the complement of the namespace qualifiers command. It does not check whether the namespace names are, in fact, the names of currently defined namespaces.

namespace upvar namespace ?otherVar myVar ...?
  この命令は､namespace 内の変数を参照する､零或はそれ以上の現在の手続き函数内の局所変数を手配する｡名前空間の名前は NAME RESOLUTION の節に記述した様に決定する｡ namespace upvar $ns a b 命令は､修飾された名前空間又は変数名の為に使用された決定法の規則を唯一の例外として､ upvar 0 ${ns}::a b と同じ振舞いをする｡ namespace upvar は空文字列を返す｡ This command arranges for zero or more local variables in the current procedure to refer to variables in namespace. The namespace name is resolved as described in section NAME RESOLUTION. The command namespace upvar $ns a b has the same behaviour as upvar 0 ${ns}::a b, with the sole exception of the resolution rules used for qualified namespace or variable names. namespace upvar returns an empty string.

namespace unknown ?script?
  現在の名前空間の為の未知の命令の操作子を返す｡その操作子は､名前空間の内部から呼出された命令が､現在の名前空間にも､名前空間の経路にも､大域名前空間にも見付けられない時に起動される｡この script 引数は､もし与えられると､命令の名前と任意附加の引数を表現し､巧みに書式化したリストであることが望ましい｡操作子が起動されると､総ての起動の行が記述譜に追記され､結果が名前空間の文脈内で評価される｡全ての名前空間の為の省略時設定の操作子は ::unknown である｡もし､引数が指定されていなければ､現在の名前空間の為の操作子を返す｡ Sets or returns the unknown command handler for the current namespace. The handler is invoked when a command called from within the namespace cannot be found in the current namespace, the namespace's path nor in the global namespace. The script argument, if given, should be a well formed list representing a command name and optional arguments. When the handler is invoked, the full invocation line will be appended to the script and the result evaluated in the context of the namespace. The default handler for all namespaces is ::unknown. If no argument is given, it returns the handler for the current namespace.

namespace which ?-command? ?-variable? name
  命令又は変数としての name を捜し､その完全に修飾した名前を返す｡譬えば､もし､ name が現在の名前空間内に実在しないが大域名前空間内に実在する場合､この命令は大域名前空間内の変数の完全に修飾した名前を返す｡もし､命令も変数も実在しない場合､この命令は空文字列を返す｡もし､変数が生成されているが､譬えば､ variable の様な命令や､その変数上の trace を通しては､定義されていない場合､この命令は完全に修飾した変数の名前を返す｡旗標が与えられないと name は命令の名前として扱われる｡名前決定に関する規則の説明は下の NAME RESOLUTION の節を参照されたい｡ Looks up name as either a command or variable and returns its fully-qualified name. For example, if name 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 variable command or through a trace on the variable, this command will return the fully-qualified name of the variable. If no flag is given, name is treated as a command name. See the section NAME RESOLUTION below for an explanation of the rules regarding name resolution.

### WHAT IS A NAMESPACE?

名前空間とは命令と変数の収集物である｡命令や変数を､他の名前空間の命令や変数と確実に干渉しない様に包み込む｡Ｔｃｌは常にこの様な収集物を１つ有していた､現在我々が大域名前空間として参照しているものである｡大域名前空間は､全ての変数と命令を保有している｡ namespace eval 命令は新しい名前空間を作らせる｡譬えば､ A namespace is a collection of commands and variables. It encapsulates the commands and variables to ensure that they will not interfere with the commands and variables of other namespaces. Tcl has always had one such collection, which we refer to as the global namespace. The global namespace holds all global variables and commands. The namespace eval command lets you create new namespaces. For example,

    namespace eval Counter {
        namespace export bump
        variable num 0

        proc bump {} {
            variable num
            incr num
        }
    }

は､変数 num と手続函数 bump を含む新しい名前空間を生成する｡この名前空間内の命令と変数は､同じ算譜内の他の命令や変数とは隔てられている｡もし､大域名前空間内に名前が bump の命令が存在すると､それは､この Counter 名前空間内の命令 bump とは別のものである｡ creates a new namespace containing the variable num and the procedure bump. The commands and variables in this namespace are separate from other commands and variables in the same program. If there is a command named bump in the global namespace, for example, it will be different from the command bump in the Counter namespace.

名前空間の変数は Tcl 内の大域変数と似ている｡それは手続函数の外の名前空間内に存在するが､手続函数内から､上に示した例の様に､ variable 命令経由で利用できる｡ 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 variable command, as shown in the example above.

名前空間は動的である｡何時でも命令や変数を追加､削除可能であり､そこで､一連の namespace eval 命令を何度も使用して名前空間の中身を作り上げることができる｡譬えば､次の様な一連の命令は上に示した名前空間の定義と同じ効果を有する: 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 namespace eval commands. For example, the following series of commands has the same effect as the namespace definition shown above:

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

註意すべきは､test 手続函数が Counter 名前空間に追加され､後に､ rename 命令経由で除去されていることである｡ Note that the test procedure is added to the Counter namespace, and later removed via the rename command.

名前空間はその中に他の名前空間を有することが可能で､そこで入れ子の階層構造になる｡入れ子になった名前空間は､その親の名前空間の中に包まれ､他の名前空間と干渉しないようにできている｡ 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.

### 修飾された名前 QUALIFIED NAMES

それぞれの名前空間は history や::safe::interp の様な本文の名前を有する｡名前空間は入れ子にでき､修飾名が命令､変数､その中に名前空間を含んでいる仔供の名前空間を参照するために使用される｡修飾名は､Unixファイル､Tkの部品､の階層構造経路と似ていて､違いは､区切り記号に､/ や . の代わりに :: が使われることである｡最頂上又は大域名前空間は名前 “” (即ち空文字列)を有す､但し:: が類義語になっている｡ 例示の様に､名前::safe::interp::create は名前空間 interp 内の命令 create を参照しており､interp は順に名前空間 ::safe の子供であり､順に大域名前空間の:: の子供になっている｡ Each namespace has a textual name such as history or ::safe::interp. 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 :: is used as the separator instead of / or .. The topmost or global namespace has the name “” (i.e., an empty string), although :: is a synonym. As an example, the name ::safe::interp::create refers to the command create in the namespace interp that is a child of namespace ::safe, which in turn is a child of the global namespace, ::.

もし､他の名前空間から命令や変数を利用するには､幾らか余計な構文を使う必要がある｡名前はそれを含む名前空間により修飾しなければならない｡大域名前空間から､Counter 手続函数を利用するにはこの様に: 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 Counter procedures like this:

    Counter::bump 5
    Counter::Reset

現在の変数 count を利用するにはこの様に: We could access the current count like this:

    puts "count = $Counter::num"

ある名前空間が別の名前空間を含んでいる時は､その要素に到達するには､更にもう一つの修飾子が必要になる｡もし名前空間 Foo が名前空間 Counter を含んでいて､その手続函数 bump を､大域名前空間から起動するにはこうする: When one namespace contains another, you may need more than one qualifier to reach its elements. If we had a namespace Foo that contained the namespace Counter, you could invoke its bump procedure from the global namespace like this:

    Foo::Counter::bump 3

命令を生成したり改名したりするにも､修飾した名前を使うことが可能である｡譬えば､手続函数に Foo という名前空間を加えることができる､この様に: You can also use qualified names when you create and rename commands. For example, you could add a procedure to the Foo namespace like this:

    proc Foo::Test {args} {return $args}

そして､その手続函数を他の名前空間に移すこともできる､この様に: And you could move the same procedure to another namespace like this:

    rename Foo::Test Bar::Test

幾らか修飾された名前に関して留意すべき事項がある｡名前空間は､大域名前空間用以外では､非空の名前を有する｡:: は､単純な命令､変数､名前空間の区切り記号を除く名前空間の名前､には許容されていない｡修飾された名前の如何なる部分についても､余分なコロンは無視される; 即ち､二つ或はそれ以上のコロンは名前空間の区切りとして扱われる｡修飾された変数又は命令の名前の末尾の:: は､名前{}の変数又は命令を参照している｡しかし､修飾された名前空間の名前の末尾の:: は無視される｡ There are a few remaining points about qualified names that we should cover. Namespaces have nonempty names except for the global namespace. :: is disallowed in simple command, variable, and namespace names except as a namespace separator. Extra colons in any separator part of a qualified name are ignored; i.e. two or more colons are treated as a namespace separator. A trailing :: in a qualified variable or command name refers to the variable or command named {}. However, a trailing :: in a qualified namespace name is ignored.

### NAME RESOLUTION

一般に､変数と名前空間の名前をとる全てのTcl 命令は､修飾された名前を運営している｡この意味は､この様な set や proc や rename や interp alias 命令には修飾された名前を与えることが可能である｡もし､ :: で始まる完全に修飾された名前を与えると､どの命令か､どの変数か､どの名前空間かを指しているかに疑問はない｡しかし､もし名前が :: で始まらない場合(即ち､相対的)､Tcl は基本的な規則によってそれを捜す: 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 set, proc, rename, and interp alias. If you provide a fully-qualified name that starts with a ::, there is no question about what command, variable, or namespace you mean. However, if the name does not start with a :: (i.e., is relative), Tcl follows basic rules for looking it up:

- 変数名は常に､最初に現在の名前空間､次に大域名前空間､を捜して決定する｡命令の名前は､やはり常に現在の名前空間を最初に捜す｡ Variable names are always resolved by looking first in the current namespace, and then in the global namespace.

- 命令の名前は､やはり常に現在の名前空間を最初に捜す｡もしそこで見付らなければ､現在の名前空間の命令経路(省略時設定では空)上の全ての名前空間を捜索する｡もし､見付らなければ､命令の名前は､大域名前空間内が捜される(もし､失敗すると､unknown 命令によって処理される)｡ Command names are always resolved by looking in the current namespace first. If not found there, they are searched for in every namespace on the current namespace's command path (which is empty by default). If not found there, command names are looked up in the global namespace (or, failing that, are processed by the appropriate namespace unknown handler.)

- 他方､名前空間の名前は常に､現在の名前空間のみを探して決定される｡ Namespace names are always resolved by looking in only the current namespace.

次の例では､ In the following example,

    set traceLevel 0
    namespace eval Debug {
        printTrace $traceLevel
    }

Tcl は名前空間 Debug 内から ､次に大域名前空間内から､traceLevel を捜す｡命令 printTrace を同じ方法で調べる｡もし､変数や命令の名前が両方の文脈から見付らないと､その名前は未定義になる｡この点を明確にするために､次の例を考察する: Tcl looks for traceLevel in the namespace Debug and then in the global namespace. It looks up the command printTrace 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:

    set traceLevel 0
    namespace eval Foo {
        variable traceLevel 3

        namespace eval Debug {
            printTrace $traceLevel
        }
    }

此処で Tcl は traceLevel を第１に名前空間 Foo::Debug の中を捜す｡そこで見付らないと､ Tcl は 大域名前空間内から捜す｡変数 Foo::traceLevel は名前決定課程の間完全に無視される｡ Here Tcl looks for traceLevel first in the namespace Foo::Debug. Since it is not found there, Tcl then looks for it in the global namespace. The variable Foo::traceLevel is completely ignored during the name resolution process.

namespace which 命令を名前決定の疑問を解消する目的で使用することができる｡譬えば､この命令は: You can use the namespace which command to clear up any question about name resolution. For example, the command:

    namespace eval Foo::Debug {namespace which -variable traceLevel}

::traceLevel を返す｡他方､この命令は､ returns ::traceLevel. On the other hand, the command,

    namespace eval Foo {namespace which -variable traceLevel}

returns ::Foo::traceLevel.

上で述べた様に､名前空間の名前は､変数の名前と命令の名前とでは調べ方が異なる｡名前空間の名前は､現在の名前空間内から常に決定する｡これの意味は､譬えば､新しい名前空間を生成する namespace eval 命令は､新しい名前空間の名前が :: で始まらない限り常に現在の名前空間の子供を生成する｡ 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 namespace eval command that creates a new namespace always creates a child of the current namespace unless the new namespace name begins with ::.

Tcl は､どの様な変数又は､命令又は､名前空間に参照可能であるのかを制限する為の利用制御機能を有しない｡もし､上述の名前決定規則によって要素を特定する様な修飾された名前を与えると､その要素を利用することができる｡ 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.

同じ名前空間内の手続函数から variable 命令を使って名前空間変数を利用できる｡ global 命令と同じ様に､これは名前空間変数への局所連結を生成する｡もし必要なら､現在の前空間内に変数を生成し初期化できる｡註意すべきは､ global 命令は大域名前空間内の変数への連結のみ生成できる｡常に､適切な修飾名を使って､名前空間内の変数に参照するならば､ variable 命令を使う必要はない｡ You can access a namespace variable from a procedure in the same namespace by using the variable command. Much like the global 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 global command only creates links to variables in the global namespace. It is not necessary to use a variable command if you always refer to the namespace variable using an appropriate qualified name.

### 命令の移入 IMPORTING COMMANDS

名前空間はしばしば外部函数群を表現することに使用される｡ある外部函数群命令は余りに頻繁に使われるので､その修飾された名前を打鍵することは煩わしい｡譬えば､ BLT の様な梱包の全ての命令は､ Blt と呼ばれる名前空間内に含まれると､仮定する｡すると､その命令をこの様に利用することになろう: 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 Blt. Then you might access these commands like this:

    Blt::graph .g -background red
    Blt::table . .g 0,0

もし､graph や table 命令を頻繁に使用すると､それを利用するのに Blt:: 接頭辞なしで利用したくなろう｡その命令を現在の名前空間内に移入すると､之が可能になる､この様に: If you use the graph and table commands frequently, you may want to access them without the Blt:: prefix. You can do this by importing the commands into the current namespace, like this:

    namespace import Blt::*

之は､ Blt 名前空間から現在の名前空間内の文脈に移送した全ての命令に加わる､そこでこの様に算譜を書く: This adds all exported commands from the Blt namespace into the current namespace context, so you can write code like this:

    graph .g -background red
    table . .g 0,0

この namespace import 命令は単に､ namespace export 命令によって移出したあの名前空間から命令を移入するだけである｡ The namespace import command only imports commands from a namespace that that namespace exported with a namespace export command.

名前空間から全ての命令を移入することは､一般には具合が悪い､理由はどれが得られたものか判らなくなるから｡必要な命令を指定して移入する方が好ましい｡譬えば､この命令は､ Importing every command from a namespace is generally a bad idea since you do not know what you will get. It is better to import just the specific commands you need. For example, the command

    namespace import Blt::graph Blt::table

この graph と table 命令だけを現在の名前空間内の文脈に移入する imports only the graph and table commands into the current context.

既に実在する命令を移入しようとすると不具合が発生する｡これは､同じ命令を異なる梱包から移入することを妨げる｡しかし､時々(多分不都合修正作業中に)､この制限を回避したくなるだろう｡名前空間内に既に現れた命令を摘上げる為に namespace import 命令を再発行したいと思うことがあるだろう｡その様な場合､ -force 指示項目を使うことができ､警告も不具合も発生することなく､既存の命令が上書きされる: 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 namespace import command to pick up new commands that have appeared in a namespace. In that case, you can use the -force option, and existing commands will be silently overwritten:

    namespace import -force Blt::graph Blt::table

何かの理由で移入した命令に使用を中止したい時は､namespace forget を使ってそれを除去できる､この様に: If for some reason, you want to stop using the imported commands, you can remove them with a namespace forget command, like this:

    namespace forget Blt::*

これは Blt から移入したどの命令も､現在の名前空間内から捜索する｡もし発見すると､除去する｡見付けられないと､何もしない｡その後､その Blt 命令は､Blt:: 接頭辞を付けて利用しなくてはならなくなる｡ This searches the current namespace for any commands imported from Blt. If it finds any, it removes them. Otherwise, it does nothing. After this, the Blt commands must be accessed with the Blt:: prefix.

その移入した名前空間から命令を削除するときは､この様にする: When you delete a command from the exporting namespace like this:

    rename Blt::graph ""

移入した全ての名前空間から命令が自動的に除去される｡ the command is automatically removed from all namespaces that import it.

### 命令の移出 EXPORTING COMMANDS

名前空間から命令を移出することができる､この様に: You can export commands from a namespace like this:

    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!"
            }
        }
    }

手続函数 bump と reset が移出される｡そこでそれは､Counter 名前空間から移入した時に含まれる､この様に: The procedures bump and reset are exported, so they are included when you import from the Counter namespace, like this:

    namespace import Counter::*

しかし､この Check 手続函数は移出されない､そこで､移入操作は無視される｡ However, the Check procedure is not exported, so it is ignored by the import operation.

この namespace import 命令は､その名前空間によって移出を宣言された命令のみを移入する｡ namespace export 命令は､他の名前空間によってどの命令が移入されうるかを指定する｡もし namespace import 命令が移出した命令ではないと指定すると､その命令は移入されない｡ The namespace import command only imports commands that were declared as exported by their namespace. The namespace export command specifies what commands may be imported by other namespaces. If a namespace import command specifies a command that is not exported, the command is not imported.

### SCOPED SCRIPTS

namespace code 命令は､それが作成されたものとは異なる名前空間内で評価する為に､記述譜を梱包する為の手段である｡行事処理機能､Tk束縛､大域文脈中での評価の追跡にしばしば使用される｡譬えば､次に示す譜は､現在の名前空間内への変数traceを如何に指示するかを示す: 　　　　　 The namespace code command is the means by which a script may be packaged for evaluation in a namespace other than the one in which it was created. It is used most often to create event handlers, Tk bindings, and traces for evaluation in the global context. For instance, the following code indicates how to direct a variable trace callback into the current namespace:

    namespace eval a {
        variable b
        proc theTraceCallback { n1 n2 op } {
            upvar 1 $n1 var
            puts "the value of $n1 has changed to $var"
            return
        }
        trace add variable b write [namespace code theTraceCallback]
    }
    set a::b c

実行すると､伝達文を印刷する: When executed, it prints the message:

    the value of a::b has changed to c

### ENSEMBLES

namespace ensemble は副命令を一緒に集めて形成した集合命令の生成と操作をする為に使われる｡この命令は構成設定可能であるが､典型的には集合が生成された時の現在の名前空間に由来する｡註意すべきは､名前空間に結合した集合は名前空間が削除された時に削除されるにも拘わらず､幾つもの名前空間と結合した幾つもの集合がありうる(無しも含む､それは省略時設定で全ての名前空間で真値である)｡集合命令とその名前空間の間の連結は､集合が名前変更されても維持される｡ The namespace ensemble is used to create and manipulate ensemble commands, which are commands formed by grouping subcommands together. The commands typically come from the current namespace when the ensemble was created, though this is configurable. Note that there may be any number of ensembles associated with any namespace (including none, which is true of all namespaces by default), though all the ensembles associated with a namespace are deleted when that namespace is deleted. The link between an ensemble command and its namespace is maintained however the ensemble is renamed.

namespace ensemble の３つの副命令が定義されている: Three subcommands of the namespace ensemble command are defined:

namespace ensemble create ?option value ...?
  現在の名前空間に連結した新しい集合命令を生成し､生成された命令の完全に修飾された名前を返す｡ namespace ensemble create への引数は恰も namespace ensemble configure 命令に伴う様に命令の構成設定を許容する｡もし､ -command 指示項目によって上書きされない場合､この命令は連結された名前空間と正確に同じ名前と共に集合を生成する｡運営されている指示項目の全ての一覧とその効果については下の ENSEMBLE OPTIONS の節を参照されたい｡ Creates a new ensemble command linked to the current namespace, returning the fully qualified name of the command created. The arguments to namespace ensemble create allow the configuration of the command as if with the namespace ensemble configure command. If not overridden with the -command option, this command creates an ensemble with exactly the same name as the linked namespace. See the section ENSEMBLE OPTIONS below for a full list of options supported and their effects.

namespace ensemble configure command ?option? ?value ...?
  名前が command の集合命令と結合した指示項目の値を取り出すか､その集合命令に結合したある指示項目を更新する｡運営している指示項目の全ての一覧とその効果に就いては下の ENSEMBLE OPTIONS の節を参照されたい｡ Retrieves the value of an option associated with the ensemble command named command, or updates some options associated with that ensemble command. See the section ENSEMBLE OPTIONS below for a full list of options supported and their effects.

namespace ensemble exists command
  命令 command が実在し且つ集合命令であるか否かを記述する論理値を返す｡この命令はこの命令への引数の個数が悪い場合にのみ不都合を返す｡ Returns a boolean value that describes whether the command command exists and is an ensemble command. This command only ever returns an error if the number of arguments to the command is wrong.

呼出された時､集合命令は最初の引数を取って調べ(下に記述した規則に沿って)集合命令と副命令を置換える語のリストを見付ける｡語のリストの結果は評価され(更なる置換はなしに)､恰も元の型であって(即ち､ Tcl_EvalObjv を通して語のリストを渡すことにより)命令の結果を返す｡註意すべきは､目的の集合を他の(同じも可)集合命令に書き直させることは合法である｡その集合命令は uplevel や info level の使用によって可視にはならない｡ When called, an ensemble command takes its first argument and looks it up (according to the rules described below) to discover a list of words to replace the ensemble command and subcommand with. The resulting list of words is then evaluated (with no further substitutions) as if that was what was typed originally (i.e. by passing the list of words through Tcl_EvalObjv) and returning the result of the command. Note that it is legal to make the target of an ensemble rewrite be another (or even the same) ensemble command. The ensemble command will not be visible through the use of the uplevel or info level commands.

#### ENSEMBLE OPTIONS

namespace ensemble create 命令と namespace ensemble configure 命令に運営されている次の指示項目は､集団命令が如何に振舞うかを制御している: The following options, supported by the namespace ensemble create and namespace ensemble configure commands, control how an ensemble command behaves:

-map
  非空の時､この指示項目は､集団命令と副命令の語の代わりに､副命令の名前から前置辞のリストへの対応を提供する辞書を与える( interp alias によって生成した別名に似た方法によって; その語は置換された後は再調査されない); もし､どれかの目標の第一語が完全に修飾されていない場合､現在の名前空間に相対的と仮定されそれに厳密に変更される(即ち､読むときは常に完全に修飾されている)｡この指示項目が空の時､対応は副命令の局所名からその完全に修飾された名前になる｡註意すべきは､この指示項目が非空で､ -subcommands 指示項目が空の時､この集団副命令は正確に､この辞書内に対応を有する語､になる｡ 　　　　　 When non-empty, this option supplies a dictionary that provides a mapping from subcommand names to a list of prefix words to substitute in place of the ensemble command and subcommand words (in a manner similar to an alias created with interp alias; the words are not reparsed after substitution); if the first word of any target is not fully qualified when set, it is assumed to be relative to the current namespace and changed to be exactly that (that is, it is always fully qualified when read). When this option is empty, the mapping will be from the local name of the subcommand to its fully-qualified name. Note that when this option is non-empty and the -subcommands option is empty, the ensemble subcommand names will be exactly those words that have mappings in the dictionary.

-parameters
  この指示項目は名前の付いた引数(その名前は不都合伝達文を生成する間に使用される)のリストを与える､後者は集団の呼出者によって､集団の名前と副命令のあいだに与えられた｡省略時設定ではこれは空リストである｡ This option gives a list of named arguments (the names being used during generation of error messages) that are passed by the caller of the ensemble between the name of the ensemble and the subcommand argument. By default, it is the empty list.

-prefixes
  この指示項目(省略時設定では集団の)は､集合命令が副命令の曖昧でない前置辞を認識するかを制御する｡断に切替えられた時､その集合命令は吹く命令の名前と厳密な合致が要求される｡ This option (which is enabled by default) controls whether the ensemble command recognizes unambiguous prefixes of its subcommands. When turned off, the ensemble command requires exact matching of subcommand names.

-subcommands
  非空の時､この指示項目は､どの副命令がその集団にあるか正確に列挙する｡その様なそれぞれの命令に対する対応は -map 指示項目内で定義されたか､又は名前空間内の同じ名前を持つ命令と集団に連結したかのいずれかである｡この指示項目が空であると､名前空間の副命令は､ -map 指示項目内で列挙された辞書の鍵であるか､又は､集団命令が起動した時の､連結した名前空間の移出した命令､である｡ When non-empty, this option lists exactly what subcommands are in the ensemble. The mapping for each of those commands will be either whatever is defined in the -map option, or to the command with the same name in the namespace linked to the ensemble. If this option is empty, the subcommands of the namespace will either be the keys of the dictionary listed in the -map option or the exported commands of the linked namespace at the time of the invocation of the ensemble command.

-unknown
  非空の時､この指示項目は､集団副命令が認識されない場合を処理し､できなければ不都合を発生する部分的な命令(それに向け､集団の完全修飾名を含んでいる､集団命令への引数である全ての語が追記される)をもたらす｡空の時は(省略時設定でもある)､何時であれ､集団が､特定の副命令を如何に実現するか定められない時は､不具合(Tcl_GetIndexFromObj の型の)が発生する｡更なる詳細については UNKNOWN HANDLER BEHAVIOUR を参照されたい｡　　　　　 When non-empty, this option provides a partial command (to which all the words that are arguments to the ensemble command, including the fully-qualified name of the ensemble, are appended) to handle the case where an ensemble subcommand is not recognized and would otherwise generate an error. When empty (the default) an error (in the style of Tcl_GetIndexFromObj) is generated whenever the ensemble is unable to determine how to implement a particular subcommand. See UNKNOWN HANDLER BEHAVIOUR for more details.

次の余分の指示項目 が namespace ensemble create に許容される: The following extra option is allowed by namespace ensemble create:

-command
  この書込み専用指示項目は､どの既存の名前空間内のどの様なものであっても､namespace ensemble create によって生成された集団の名前を許容する｡この指示項目の省略時の値は､その中で namespace ensemble create 命令が起動された名前空間の完全に修飾された名前である｡ This write-only option allows the name of the ensemble created by namespace ensemble create to be anything in any existing namespace. The default value for this option is the fully-qualified name of the namespace in which the namespace ensemble create command is invoked.

次の余分の指示項目 が namespace ensemble configure に許容される: The following extra option is allowed by namespace ensemble configure:

-namespace
  この読出し専用指示項目は集団がその中に生成された名前空間の完全に修飾された名前の取り出しを許容する｡ This read-only option allows the retrieval of the fully-qualified name of the namespace which the ensemble was created within.

#### UNKNOWN HANDLER BEHAVIOUR

もし､未知操作子が集団として指定されていると､その操作子は集団命令が､どの副命令を起動すべきか決定できないことに起因する不都合以外で戻る時に呼出される｡それが生じたもとになる､正確な条件は上で記述した様に､-subcommands と -map と -prefixes 指示項目により制御されている｡ If an unknown handler is specified for an ensemble, that handler is called when the ensemble command would otherwise return an error due to it being unable to decide which subcommand to invoke. The exact conditions under which that occurs are controlled by the -subcommands, -map and -prefixes options as described above.

未知の操作子を実行するために､この集団の仕組みは､指定した -unknown 指示項目をとり､集団命令の起動を試みたそれぞれの引数を追記する(集団命令そのものを含み､完全に修飾した名前として表現した)｡次に､試みに呼出した有効範囲内で結果の命令を起動する｡もし､未知操作子の実行が無事に終了すると､集団機能譜は副命令を再調査し(下に述べる様に)､再び急送しようと試みる､未知操作子により集団の構成設定が更新された時の為に､それが理想的である｡他の何れの種類の未知操作子の終了も不具合として扱われる｡ To execute the unknown handler, the ensemble mechanism takes the specified -unknown option and appends each argument of the attempted ensemble command invocation (including the ensemble command itself, expressed as a fully qualified name). It invokes the resulting command in the scope of the attempted call. If the execution of the unknown handler terminates normally, the ensemble engine reparses the subcommand (as described below) and tries to dispatch it again, which is ideal for when the ensemble's configuration has been updated by the unknown subcommand handler. Any other kind of termination of the unknown handler is treated as an error.

未知操作子の結果はリストであると期待される(そうでなければ不都合が発生する)｡もし､そのリストが空リストであると､集団命令は､元の副命令を再度調べようと試みる､そして､この時も見付けられないと､恰も､ -unknown 操作子が其処に無かったかの如く､不都合を発生する(即ち､如何なる集団の特別の起動に対しても､その未知操作子は多くても１度だけ呼出される)｡このことは､未知操作子の為に､集団又は､支持している名前空間の更新を容易にし､ひいては､望ましい副命令の実現の提供と再調査を簡単にする｡ The result of the unknown handler is expected to be a list (it is an error if it is not). If the list is an empty list, the ensemble command attempts to look up the original subcommand again and, if it is not found this time, an error will be generated just as if the -unknown handler was not there (i.e. for any particular invocation of an ensemble, its unknown handler will be called at most once.) This makes it easy for the unknown handler to update the ensemble or its backing namespace so as to provide an implementation of the desired subcommand and reparse.

結果が非空のリストの時､そのリストの語は､恰も､それが -map の中で調べられたと同じように｡その集団命令と副命令の置換に使われる｡もし副命令の実現が集団命令の呼出し側の名前空間内ではないならば､全ての名前空間修飾子を供給することは未知操作子の責務である｡又､註意すべきは､集団命令は､繋ぎ合された時(譬えば､ text 部品の荷札と副命令の印と､似ている方法で､集団の中に集団副命令を実現する命令の一つを作成する)､最も外の集団の呼出し側の文脈内で書直しが生ずる｡集団はそれ自身､Tcl 呼出し棚の上に如何なる名前空間の文脈も置かないことを意味する｡ When the result is a non-empty list, the words of that list are used to replace the ensemble command and subcommand, just as if they had been looked up in the -map. It is up to the unknown handler to supply all namespace qualifiers if the implementing subcommand is not in the namespace of the caller of the ensemble command. Also note that when ensemble commands are chained (e.g. if you make one of the commands that implement an ensemble subcommand into an ensemble, in a manner similar to the text widget's tag and mark subcommands) then the rewrite happens in the context of the caller of the outermost ensemble. That is to say that ensembles do not in themselves place any namespace contexts on the Tcl call stack.

空の -unknown 操作子が与えられると(省略時設定でもある)､集団命令は､集団が定義された命令のリストに基いて不具合伝達文を発生する( Tcl_GetIndexFromObj からの不具合伝達文に似た書式による)｡これは､再調査中に依然として副命令が認識されない時に発生される不具合である｡その名前空間を消去する為の -unknown 操作子に関する不具合でもある｡ Where an empty -unknown handler is given (the default), the ensemble command will generate an error message based on the list of commands that the ensemble has defined (formatted similarly to the error message from Tcl_GetIndexFromObj). This is the error that will be thrown when the subcommand is still not recognized during reparsing. It is also an error for an -unknown handler to delete its namespace.

### 用例 EXAMPLES

変数と､移出した命令を含む名前空間を生成する: Create a namespace containing a variable and an exported command:

    namespace eval foo {
        variable bar 0
        proc grill {} {
            variable bar
            puts "called [incr bar] times"
        }
        namespace export grill
    }

前の例で定義した命令を種々の方法で呼出す｡ Call the command defined in the previous example in various ways.

    # 直接呼出し	# Direct call
    ::foo::grill

    # 名前を見付る為に経路決定の命令を使う
    # Use the command resolution path to find the name
    namespace eval boo {
        namespace path ::foo
        grill
    }

    # 現在の名前空間に移入し､局所の別名を呼ぶ
    # Import into current namespace, then call local alias
    namespace import foo::grill
    grill

    # ensembleを２つ作る､一つは省略時設定の名前､他方は
    # 指定した名前で､次に､ensembleの名前で呼出す｡
    # Create two ensembles, one with the default name and one with a
    # specified name.  Then call through the ensembles.
    namespace eval foo {
        namespace ensemble create
        namespace ensemble create -command ::foobar
    }
    foo grill
    foobar grill

上述の例の中で命令がどこから来たのか調べる: Look up where the command imported in the previous example came from:

    puts "grill came from [namespace origin grill]"

現在の名前空間から､移入命令を一掃する: Remove all imported commands from the current namespace:

    namespace forget {*}[namespace import]

第１と第２の引数の間に演算子が挿入されることを許容する為の -parameters 指示項目を使用して､単純な数と一緒に作動する集合を生成する｡ Create an ensemble for simple working with numbers, using the -parameters option to allow the operator to be put between the first and second arguments.

    namespace eval do {
        namespace export *
        namespace ensemble create -parameters x
        proc plus  {x y} {expr { $x + $y }}
        proc minus {x y} {expr { $x - $y }}
    }

    # 使用するには､集合はこの様に動く:
    # In use, the ensemble works like this:
    puts [do 1 plus [do 9 minus 7]]

### SEE ALSO

interp, upvar, variable

### KEYWORDS

command, ensemble, exported, internal, variable
Copyright © 1993-1997 Bell Labs Innovations for Lucent Technologies
Copyright © 1997 Sun Microsystems, Inc.
Copyright © 2000 Scriptics Corporation.
Copyright © 2004-2005 Donal K. Fellows.