uplevel

ReferenceTOPKeywords

コマンド名

uplevel -異なるスタックフレームにおいてスクリプトを実行します。

構文

uplevel ?level? arg ?arg ...?

解説

全ての arg 引数は concatに渡されたかのように連結されます。結果的に引数はlevel で示された変数の文脈で評価され、Uplevelの戻り値はその評価の結果です。

level が整数であればレベル数を表します。これはコマンドを実行する前にプロシージャのコール・スタックでのレベルアップさせるステップ数です。 level の先頭が#で、その後が数字であれば、その数字は絶対的レベル番号を表します。level が省略される場合の既定値は1です。最初のコマンドarg が数字か#で始まる場合、level は省略できません。

例えば、プロシージャaはトップレベルからコールされ、そしてabをコールし、bcをコールし、cuplevelコマンドを呼び出すと仮定します。 level 1または#2、もしくは省略される場合、本コマンドはbの変数文脈において実行されることになります。level 2または#1ならば、本コマンドはaの変数文脈において実行されることになります。level 3または#0の場合、本コマンドがトップレベル文脈で実行されることになり、この場合はグローバル変数しか見えません。

uplevelコマンドが実行されると、uplevelをコールしたプロシージャはコールスタックから削除されます。前述の例においてcuplevelコマンドを呼び出すと仮定します。

uplevel 1 {set x 43; d}

dは別のTclプロシージャです。 setコマンドはbの文脈において変数xを変更することになります。同じようにdはまるでbから呼ばれたかのようにレベル3で実行されます。さらにdで下記コマンドを実行することとします。

uplevel {set x 42}

この場合setコマンドはb文脈において同じ変数xを修正します。プロシージャcdが実行されているときにはコールスタックに存在しません。「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.