uplevel
Команда выполняет скрипт в контексте, отличном от текущего. СИНТАКСИС  
uplevel?level? arg?arg...?
ОПИСАНИЕ  
Все аргументы команды объединяются как при выполнении команды concat. Получившийся скрипт выполняется в контексте, указанном level. Команда возвращает результат выполнения скрипта.

Если аргумент level задан как целое число, он указывает на сколько уровней выше уровня контекста текущей процедуры надо подняться в стеке вызовов перед выполнением скрипта. Если аргумент level задан как символ ‘#’ с последующим целым числом, то он задает абсолютный уровень контекста в стеке. Если аргумент level отсутствует, то используется значение по умолчанию ‘1’. Аргумент level должен быть указан, если первый из аргументов arg начинается с цифры или символа ‘#’.

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

При выполнении команды uplevel контекст вызывающей процедуры временно удаляется из стека вызовов процедур. Так, если в приведенном выше примере команда uplevel имеет вид

uplevel 1 {set x 43; d} где d — имя другой Tcl — процедуры, то команда set изменит переменную x в контексте процедуры b, а процедура d будет выполняться на третьем уровне стека, как если бы она была вызвана непосредственно из b. Если в процедуре d в свою очередь содержится команда uplevel {set x 42} то команда set изменит значение той же переменной x в контексте процедуры b. Процедура c во время выполнения процедуры d не будет видна в стеке. Соответственно команда info level возвратит уровень текущей процедуры.

Команда uplevel позволяет создавать новые управляющие конструкции как Tcl-процедуры.

Команда namespace eval так же, как и вызовы процедур, изменяет контекст, в котором выполняются команды. Соответственно, для каждой команды namespace eval  создается дополнительный уровень в стеке. Поэтому при указании уровня контекста в стеке каждую вложенную команду namespace eval  надо считать наравне с вызовом процедуры. Это относится также к командам upvar и info level. Например, команда

info level 1 вернет список, описывающий самую верхнюю выполняемую команду, которая является либо вызовом процедуры, либо командой namespace eval. Независимо от использования команда namespace eval  команда uplevel #0 выполнит соответствующий скрипт на уровне глобальных переменных (в глобальном пространстве имен).

[ Список команд Tcl ]            [ Содержание ]