upvar

ReferenceTOPKeywords

コマンド名

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をプラスします。add2upvarの代わりに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変数を新しいターゲットに関連させることは可能です。

traceと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.