uplevel -異なるスタックフレームにおいてスクリプトを実行します。
uplevel ?level? arg ?arg ...?
全ての arg 引数は concatに渡されたかのように連結されます。結果的に引数はlevel
で示された変数の文脈で評価され、Uplevelの戻り値はその評価の結果です。
level が整数であればレベル数を表します。これはコマンドを実行する前にプロシージャのコール・スタックでのレベルアップさせるステップ数です。
level の先頭が#で、その後が数字であれば、その数字は絶対的レベル番号を表します。level
が省略される場合の既定値は1です。最初のコマンドarg
が数字か#で始まる場合、level は省略できません。
例えば、プロシージャaはトップレベルからコールされ、そしてaがbをコールし、bがcをコールし、cがuplevelコマンドを呼び出すと仮定します。
level が1または#2、もしくは省略される場合、本コマンドはbの変数文脈において実行されることになります。level
が2または#1ならば、本コマンドはaの変数文脈において実行されることになります。level
が3または#0の場合、本コマンドがトップレベル文脈で実行されることになり、この場合はグローバル変数しか見えません。
uplevelコマンドが実行されると、uplevelをコールしたプロシージャはコールスタックから削除されます。前述の例においてcがuplevelコマンドを呼び出すと仮定します。
uplevel 1 {set x 43; d}
dは別のTclプロシージャです。 setコマンドはbの文脈において変数xを変更することになります。同じようにdはまるでbから呼ばれたかのようにレベル3で実行されます。さらにdで下記コマンドを実行することとします。
uplevel {set x 42}
この場合setコマンドはb文脈において同じ変数xを修正します。プロシージャcはdが実行されているときにはコールスタックに存在しません。「info
level 」コマンドを使えば、現在のプロシージャのレベルを取得することができます。
Uplevelは新しい制御構造をTclのプロシージャとして使うことを可能にします。例えば、uplevelはwhile構造Tclプロシージャとして実行するために使われます。
namespace evalは(プロシージャの呼び出し以外に)Tclの命名文脈を変えるもう1つの方法です。namespace
evalはnamespaceの文脈を表すために、コールフレームをスタックに加えます。つまりuplevel及び
upvarコマンドで使われるコールレベルは、namespace
evalコマンドが使われるたびにカウントアップされます。例えば、info
level 1はコマンドリストを返します。このコマンドリストのコマンドは最も外側のプロシージャ呼び出しか、最も外側のnamespace
evalコマンドのいずれかにあたります。uplevel #0は、最も外側のnamespace
( グローバルnamespace ) のトップレベルでスクリプトを評価します。
namespace, upvar
context, level,
namespace, stackframe, variable
Copyright © 1993 The Regents of the University of California.
Copyright © 1994-1997 Sun Microsystems, Inc.
Copyright © 1995-1997 Roger E. Critchlow Jr.
|