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 выполнит соответствующий скрипт на уровне глобальных переменных (в глобальном пространстве имен).