特定のプロシージャの実行に対してローカルではない Tcl 変数は、名前空間にバインドする必要があります。名前空間はグローバル名前空間にすることができます (そのための特別なコマンドがあります) が、そうである必要はありません。したがって、変数を 2 つのプロシージャ間で共有するには、変数に公開名を付ける必要があります。
proc testList {{setup_file ""}} {
# Use the 'eq' operator; more efficient for string equality
if {$setup_file eq ""} {
set setup_file location
}
global setupFile
set setupFile $setup_file
}
proc run {} {
global setupFile
puts "$setupFile"
}
さて、それは完全な変数を共有するためのものです。値を共有したいだけであれば、他にもいくつかの選択肢があります。たとえば、次の 2 つの可能性があります。
proc testList {{setup_file ""}} {
if {$setup_file eq ""} {
set setup_file location
}
# Create a procedure body at run-time
proc run {} [concat [list set setupFile $setup_file] \; {
puts "$setupFile"
}]
}
proc testList {{setup_file ""}} {
if {$setup_file eq ""} {
set setup_file location
}
# Set the value through combined use of aliases and a lambda term
interp alias {} run {} apply {setupFile {
puts "$setupFile"
}} $setup_file
}
Tcl 8.6 にはさらに多くのオプションがありますが、それはまだベータ版です。