それでは、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} |