それでは、namespaceの簡単な例を説明します。
namespace eval Hello {
variable var {Hello World}
proc print {} {
variable var
puts $var
}
}
|
namespace eval Hello {
variable var {Hello World}
}
proc Hello::print {} {
variable var
puts $var
}
|
namespaceの変数とプロシジャはnamespace名とスコープ解決演算子(::)を使ってアクセスします。
puts $Hello::var =>Hello World Hello::print =>Hello World |
namespace eval Hello {
variable var {Hello World}
namespace export print
proc print {} {
variable var
puts $var
}
}
|
呼び出し側は、import宣言をする必要があります。
importでプロシジャ名に'*'を指定すると全てのプロシジャにマッチします。
namespace import Hello::print print =>Hello World |
namespace import Hello::* print =>Hello World |
namespace eval Hello {
variable var {Hello World}
proc print {} {
variable var
after 1000 {puts $var}
}
}
Hello::print
|
解決策としては、codeコマンドでnamespaceを事前に解決したコードを生成する方法です。
namespace eval Hello {
variable var {Hello World}
proc print {} {
set cmd [namespace code {puts $var}]
after 1000 $cmd
}
}
Hello::print
|
この時、事前に解決したコード($cmd変数の内容)は以下の様になります。
inscopeコマンドは、指定されたnamespaceで引数のコマンドを実行します。
namespace inscope ::Hello {puts $var}
|