Если аргумент 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 позволяет создавать новые управляющие конструкции как Tcl-процедуры.
Команда namespace eval так же, как и вызовы процедур, изменяет контекст, в котором выполняются команды. Соответственно, для каждой команды namespace eval создается дополнительный уровень в стеке. Поэтому при указании уровня контекста в стеке каждую вложенную команду namespace eval надо считать наравне с вызовом процедуры. Это относится также к командам upvar и info level. Например, команда