## Tcl8.6.17/Tk8.6.17 Documentation > Tcl Commands > uplevel

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

### NAME

uplevel — 記述譜を異なる棚枠上で実行する Execute a script in a different stack frame

### 構文 SYNOPSIS

uplevel ?level? arg ?arg ...?

### 説明 DESCRIPTION

全ての arg 引数が concat 命令に渡されたかの如く連結され ; その結果が level によって指し示された変数文脈の中で評価され ; その評価結果を uplevel が返す｡ All of the arg arguments are concatenated as if they had been passed to concat; the result is then evaluated in the variable context indicated by level. Uplevel returns the result of that evaluation.

もし level が整数であれば､それはその命令を実行する前に移動する為の(手続呼出し棚枠迄の)距離を与える｡もし level が # に数字を続けて構成されていたら､その数字は絶対水準番号を与える｡もし､level が省略されていたら､省略時設定の1と看做される｡命令の最初の引数が数字か # で始まっている場合は level は省略時設定にはなり得ない｡ If level is an integer then it gives a distance (up the procedure calling stack) to move before executing the command. If level consists of # followed by a number then the number gives an absolute level number. If level is omitted then it defaults to 1. Level cannot be defaulted if the first command argument starts with a digit or #.

譬えば､頂上水準から､手続函数 a が起動され､それが b を呼び､更に､b が c を呼んだと假定する｡その c が uplevel 命令を起動したと假定する｡もし level が 1 か #2 か､省略されたか､の場合､命令は､ b の変数の文脈で実行される｡もし､ level が 2 か #1 の場合､その命令は a の変数の文脈で実行される｡もし､ level が 3 か #0 の場合､その命令は､頂上水準(大域変数のみ使える)で実行される｡ For example, suppose that procedure a was invoked from top-level, and that it called b, and that b called c. Suppose that c invokes the uplevel command. If level is 1 or #2 or omitted, then the command will be executed in the variable context of b. If level is 2 or #1 then the command will be executed in the variable context of a. If level is 3 or #0 then the command will be executed at top-level (only global variables will be visible).

命令を実行している間､起動した手続函数は､uplevel により､手続呼出し棚から消滅している｡上の例では､ c が命令を起動したと假定すると､ The uplevel command causes the invoking procedure to disappear from the procedure calling stack while the command is being executed. In the above example, suppose c invokes the command

    uplevel 1 {set x 43; d}

ここで､d は､別のTcl 手続函数である｡この set 命令は b の文脈の中で変数 x を変更し､次に､d は恰も b から呼出されたかの如く､水準３で実行される｡もし､ d が､順番に次の命令を実行すると where d is another Tcl procedure. The set command will modify the variable x in b's context, and d will execute at level 3, as if called from b. If it in turn executes the command

    uplevel {set x 42}

そこで､この set 命令は b の文脈の中で同じ変数xを変更する: d を実行している間､手続函数 c は呼出し棚に現れることはない｡ info level 命令を使うと現在実行中の手続函数の水準を知ることができる｡ then the set command will modify the same variable x in b's context: the procedure c does not appear to be on the call stack when d is executing. The info level command may be used to obtain the level of the current procedure.

uplevel により､Tcl 手続函数として､新しい制御構造を実装することができる(譬えば､Tcl 手続函数として while 構造を実装するためにuplevel を使用する事ができる)｡ Uplevel makes it possible to implement new control constructs as Tcl procedures (for example, uplevel could be used to implement the while construct as a Tcl procedure).

namespace eval と apply 命令はTcl の名前付け文脈を変更する為の別法(手続函数呼出しの他に)を提供する｡それらは､名前空間文脈を表す為の棚に呼出し枠を付加する｡それは､それぞれの namespace eval 命令は､ uplevel 命令と upvar 命令の為に別の呼出し水準を追加することを意味する｡譬えば､info level 1 命令は最外層の手続函数呼出し､又は､最外層の namespace eval 命令のどちらかの命令を記述したリストを返す｡又､ uplevel #0 は最外層の名前空間(大域名前空間)内の頂上水準で記述譜を評価する｡ The namespace eval and apply commands offer other ways (besides procedure calls) that the Tcl naming context can change. They add a call frame to the stack to represent the namespace context. This means each namespace eval command counts as another call level for uplevel and upvar commands. For example, info level 1 will return a list describing a command that is either the outermost procedure call or the outermost namespace eval command. Also, uplevel #0 evaluates a script at top-level in the outermost namespace (the global namespace).

### 用例 EXAMPLE

上記のように､この uplevel 命令は､新しい制御構造を作成するのに便利である｡ この例では､常に繰返し本体の実行の後に試験を遂行するすること以外は､ while に類似した do 命令(不具合の取扱は除外している)を作成するために､如何に使用できるかを示す: As stated above, the uplevel command is useful for creating new control constructs. This example shows how (without error handling) it can be used to create a do command that is the counterpart of while except for always performing the test after running the loop body:

    proc do {body while condition} {
        if {$while ne "while"} {
            error "required word missing"
        }
        set conditionCmd [list expr $condition]
        while {1} {
            uplevel 1 $body
            if {![uplevel 1 $conditionCmd]} {
                break
            }
        }
    }

### SEE ALSO

apply, namespace, upvar

### KEYWORDS

context, level, namespace, stack frame, variable
Copyright © 1993 The Regents of the University of California.
Copyright © 1994-1997 Sun Microsystems, Inc.