upvar -
異なるスタックフレームの変数へのリンクを作成します。
upvar ?level? otherVar myVar ?otherVar myVar ...?
このコマンドはカレントプロシージャの1つ、又は複数のローカル変数を、上級プロシージャ変数あるいはグローバル変数にリンクさせるためのものです。levelのフォーマットはuplevel コマンドで使用可能なものと同じです。そしてotherVarの最初の文字が#か数値でなければlevelは省略されます(既定値は1)。upvarは各otherVar引数に対してlevel
( もしくはevel が#0ならばグローバルレベル )
で指定されたプロシージャフレームの中でotherVarという変数を作成し、そして現在のプロシージャから対応するmyVar引数によって指定された名前で、この作成された変数をアクセス可能にします。otherVarによって指定された変数はコールの時に存在する必要がありません。普通
の変数とまったく同じように初めてmyVarが参照される時点で作成されます。upvarが実行される時に名前がmyVarである変数は存在してはなりません。
MyVarは常に配列の要素ではなく変数の名前として扱われます。MyVarの名前がa
( b ) のように、配列の要素にみえても作成されるのは普通の変数です。OtherVarはスカラ変数、配列または配列要素を参照することができます。
Upvarの戻り値は空白の文字列です。
upvarコマンドは名指しでプロシージャをコールする場合のインプリメントを簡単化します。更にTclのプロシージャとして新しい制御構造を作成することを容易にします。例えば、次のプロシージャを見てみましょう。
proc add2 name {
upvar $name x
set x [expr $x+2]
}
Add2は変数名として指定する引数でコールされます。引数変数の値に2をプラスします。add2はupvarの代わりにuplevelを使用することも可能ですが、upvarを使うことによってadd2が一層簡単にコール側プロシージャフレームの変数にアクセスすることができます。
namespace evalはプロシージャ呼び出し以外にTclの命名文脈を変えるもう1つの方法です。
upvarは1つのコールフレームをスタックに追加することでnamespace文脈を表します。uplevel及びupvarコマンドでは各namespace
evalコマンドの別のコールレベルとしてカウントされます。例えば、Info
level 1は最も外側のプロシージャ呼び出しか、最も外側のnamespace
evalコマンドのいずれかであるコマンドを表すリストを返します。それにuplevel
#0は最も外側のnamespace ( グローバルnamespace )
においてトップレベルのスクリプトを評価します。
upvar変数が設定されていない場合 ( 例えば、上記のadd2におけるx
)、 unset操作を影響するのはupvar変数ではなく、その変数に連結されている変数です。定義されるプロシージャが終了する時以外はupvar変数をunsetする方法がありません。しかし別のupvarコマンドを実行することによってupvar変数を新しいターゲットに関連させることは可能です。
Upvarは簡単ではあるが予期しない形でトレースと相互に作用する場合があります。変数トレースがotherVar上で定義された場合、そのトレースはmyVarを使うアクションによって実行されます。しかしながら、トレースプロシージャはotherVarの名前よりmyVarの名前を優先的に渡します。つまり、次のコードの出力は、originalVarでなく、localVarです。
proc traceproc { name index op } {
puts $name
}
proc setByUpvar { name value } {
upvar $name localVar
set localVar $value
}
set originalVar 1
trace variable originalVar w traceproc
setByUpvar originalVar 2
}
otherVarが配列の要素であれば、myVarがアクセスされれも、全体の配列変数のためのトレースセットは実行されません
(
しかし、特別な要素上のトレースが実行される)。特に、その配列がenvであればmyVarに作られた変数は正しく下位
過程に渡されません。
global, namespace,
uplevel, variable
context, frame,
global, level,
namespace, procedure,
variable
Copyright © 1993 The Regents of the University of California.
Copyright © 1994-1997 Sun Microsystems, Inc.
Copyright © 1995-1997 Roger E. Critchlow Jr.
|