Spec-Zone.ru › Tcl/Tk

uplevel

Имя

uplevel — Выполнение скрипта в другом стеке вызовов

Синтаксис

uplevel ?уровень? аргумент ?аргумент ...?

Описание

Все аргументы аргумент конкатенируются так, как если бы они были переданы в concat; результат затем оценивается в контексте переменной, указанном уровнем. Uplevel возвращает результат этой оценки.

Если уровень является целым числом, то он задаёт расстояние (вверх по стеку вызовов процедур) для перемещения перед выполнением команды. Если уровень состоит из #, за которым следует число, то число задаёт абсолютный номер уровня. Если уровень опущен, то он по умолчанию равен 1. Уровень не может быть по умолчанию, если первый аргумент команда начинается с цифры или #.

Например, предположим, что процедура a была вызвана с верхнего уровня, и что она вызвала b, и что b вызвала c. Предположим, что c вызывает команду uplevel. Если уровень равен 1 или #2 или опущен, то команда будет выполнена в контексте переменных b. Если уровень равен 2 или #1, то команда будет выполнена в контексте переменных a. Если уровень равен 3 или #0, то команда будет выполнена на верхнем уровне (видимы только глобальные переменные).

Команда uplevel заставляет вызывающую процедуру исчезнуть из стека вызовов процедур во время выполнения команды. В приведенном выше примере предположим, что c вызывает команду

uplevel 1 {set x 43; d}

где d — другая процедура Tcl. Команда set изменит переменную x в контексте b, и d будет выполнена на уровне 3, как если бы она была вызвана из b. Если она в свою очередь выполнит команду

uplevel {set x 42}

то команда set также изменит ту же переменную x в контексте b: процедура c не отображается в стеке вызовов при выполнении d. Команда info level может быть использована для получения уровня текущей процедуры.

Uplevel позволяет реализовывать новые управляющие конструкции как процедуры Tcl (например, uplevel можно использовать для реализации конструкции while как процедуры Tcl).

Команды namespace eval и apply предлагают другие способы (кроме вызовов процедур), как может измениться контекст именования Tcl. Они добавляют в стек вызовов фрейм для представления контекста именования. Это означает, что каждая команда namespace eval считается ещё одним уровнем вызова для команд uplevel и upvar. Например, info level 1 вернёт список, описывающий либо внешний вызов процедуры, либо внешний вызов namespace eval. Кроме того, uplevel #0 оценивает скрипт на верхнем уровне во внешнем именованном пространстве (глобальном именованном пространстве).

Пример

Как указано выше, команда uplevel полезна для создания новых управляющих конструкций. Этот пример показывает, как (без обработки ошибок) она может использоваться для создания команды do, которая является аналогом while, за исключением того, что проверка всегда выполняется после выполнения тела цикла:
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
        }
    }
}

См. также

apply, namespace, upvar

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/uplevel.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/uplevel.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API