わかりづらいので、普通の使い方だけにしておけば とりあえず安心でしょう。
$Id$
proc や変数が属する階層のようなもの。
同じ x でも ::x (大域) と
::hoge::x (名前空間::hogeに属す)では別物として扱われる。
定義する段階では単に"::"が含まれる名前とあまり違いがないような。
例:
::set x 0set x 0proc ::http::hoge {} {}::http::hoge という名のprocを定義する。
(名前空間 http である、というのはこの段階では字面上は あまり関係ない?)
とりあえず新しい関数なんかは名前空間に押し込んでしまえば、他の関数名と ぶつかる心配はなくなる。 階層を溯って探す機能があるので、継承ごっこも可能。
namespace eval namespace {command ...}
Pascalの use みたいなものですか。
特定の名前空間に属するprocはその名前空間で実行される。
ex. ::hoge というproc は 名前空間"::"(大域。global context)で実行される。
ex. ::noge::hoge というproc は 名前空間"::noge"で実行される。
ただし変数に関してはvariable宣言しておかないと、::noge::hoge中といえども
ただの"x"はローカル変数のまま。
set x 0"では、どこの変数が 0 になる?従来のTclでは、
variable コマンドって?global の名前空間版。
あらかじめ namespace eval ::hoehoe {variable x} としておくと、
溯るのが防がれるため、::x が存在していても
namespace eval ::hoehoe {set x} はエラーになる。
(namespace eval内のvariableの効果ってこれくらいか〜?)
いきなり namespace eval ::hoehoe {set x 0} とすると、
::hoehoe::x がセットされる。(なんでだろー)
set ::x 1 の後に上を実行すると、::x が 0 になる。
variable x は、
現在の名前空間の x ([namespace current]::x) を "x"とする。
variable ::hoehoe::x は、::hoehoe::x を "x"とする。
proc内でnamespace evalった場合はproc直下ではなくnamespace eval の挙動に従う。
namespace eval 内で variable ::hoehoe::x としても、
以後 "x" が ::hoehoe::xになるわけではない。
(ローカル変数が存在しないコンテキストだから)
単に::hoehoe::xを予約する意味をもつだけ。
なお、「未定義のまま予約する」というのはsetではできない。variableでしかできない芸当。
global宣言と同じで、proc内でvariable宣言していないものはローカル変数なので、
proc脱出後は消えてしまう。
::hoehoe::proc1 内は確かに 名前空間::hoehoeで実行されるのだが、
明示的に variable x としてやらないと "x" は ::hoehoe::x にならない。
proc ::hoehoe::proc1 {] {set x 0} は、
::hoehoe::xが存在していてもローカルに代入される。
なお、globalコマンドと違い、 variable name ?value?
なので、variable x y とすると ::hoehoe::x に "y" が代入される。
なお、変数ではなく proc については、ローカルもくそもないので 常に現在の名前空間から検索される。なければ遡って探す。
proc ::hone::a {} \
{
namespace eval ::hoehoe {
variable ::hone::xx
set xx 342
}
}
::hone::a
とすると、どこのxxに代入されるでしょうか?
([A] ::hoehoe::xx。::hone::xxは予約されるだけ)
わたしもそー思います。 深く考えてはいかんのかも。
とりあえず、
variable x で、現名前空間の x を使う
namespace eval内での variable x で、現名前空間の x を予約する
variableコマンドで可能。
yes. 頭の"::"は絶対パスのような意味になる。 従ってglobalコマンドは不要といえば不用になる。 (global x == variable ::x)
たぶん。
proc内ならローカル変数。
それ以外なら基本的にはその名前空間に属する変数。なければ上の名前空間へ探しにいく。 この溯り検索(LISP用語でええと…なんて言ったっけ…)は、proc直下では行われない。
ないみたい。([namespace current]::変数名 は(常に)ローカル変数ではない)
それ以前に、variable y の時点で「すでにyはあるでよ」エラーになる。
(i.e 名前空間 ::hoehoe から hoge を呼ぶと、hogeの中は::hoehoe内で実行されるのか?)
またがない。
同じprocはどう起動しても同じ名前空間で実行される。
つーかそのprocの属している名前空間で実行される。
…proc呼び出しは常にfully-qualified namespace nameに展開できるから、
どの名前空間で実行されるかも明確に決められる。
(一般にはNo。ただしhoge==::hoehoe::hogeならYes。)