わかりづらいので、普通の使い方だけにしておけば とりあえず安心でしょう。
$Id$
proc や変数が属する階層のようなもの。
同じ x でも ::x
(大域) と
::hoge::x
(名前空間::hogeに属す)では別物として扱われる。
定義する段階では単に"::
"が含まれる名前とあまり違いがないような。
例:
::set x 0
set x 0
proc ::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。)