<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>uplevel</title> </head> <body> <h1>uplevel</h1> <p> Команда выполняет скрипт в контексте, отличном от текущего.</p> <h2>СИНТАКСИС</h2> <pre> <strong>uplevel</strong> ?<em>level</em>? <em>arg</em> ?<em>arg</em>...? </pre> <h2>ОПИСАНИЕ</h2> <p>Все аргументы команды объединяются как при выполнении команды <a href="concat.html"><strong>concat</strong></a>. Получившийся скрипт выполняется в контексте, указанном <em>level</em>. Команда возвращает результат выполнения скрипта.</p> <p>Если аргумент <em>level</em> задан как целое число, он указывает на сколько уровней выше уровня контекста текущей процедуры надо подняться в стеке вызовов перед выполнением скрипта. Если аргумент <em>level</em> задан как символ <strong>#</strong> с последующим целым числом, то он задает абсолютный уровень контекста в стеке. Если аргумент <em>level</em> отсутствует, то используется значение по умолчанию <strong>1</strong>. Аргумент <em>level</em> должен быть указан, если первый из аргументов arg начинается с цифры или символа <strong>#</strong>.</p> <p>Например, предположим, что на самом верхнем уровне вызвана процедура a из нее вызвана процедура b, а из b вызвана процедура c. Предположим также, что в процедуре c есть вызов команды <strong>uplevel</strong>. Тогда если аргумент <em>level</em> равен <strong>1</strong> или <strong>#2</strong> или отсутствует, то указанный в команде скрипт будет выполнен в контексте процедуры b. Если аргумент <em>level</em> равен <strong>2</strong> или <strong>#1</strong>, то указанный в команде скрипт будет выполнен в контексте процедуры a. Если аргумент <em>level</em> равен <strong>3</strong> или <strong>#0</strong>, то указанный в команде скрипт будет выполнен на вернем уровне (уровень глобальных переменных).</p> <p>При выполнении команды <strong>uplevel</strong> контекст вызывающей процедуры временно удаляется из стека вызовов процедур. Так, если в приведенном выше примере команда <strong>uplevel</strong> имеет вид</p> <pre> uplevel 1 {set x 43; d} </pre> <p>где d имя другой Tcl процедуры, то команда <a href= "set.html"><strong>set</strong></a> изменит переменную x в контексте процедуры b, а процедура d будет выполняться на третьем уровне стека, как если бы она была вызвана непосредственно из b. Если в процедуре d в свою очередь содержится команда</p> <pre> uplevel {set x 42} </pre> <p>то команда <a href="set.html"><strong>set</strong></a> изменит значение той же переменной x в контексте процедуры b. Процедура c во время выполнения процедуры d не будет видна в стеке. Соответственно команда <a href="info.html#level"> <strong>info level</strong></a> возвратит уровень текущей процедуры. <p>Команда <strong>uplevel</strong> позволяет создавать новые управляющие конструкции как Tcl-процедуры.</p> <p>Команда <a href="namespace.html#eval"><strong>namespace eval</strong></a> так же, как и вызовы процедур, изменяет контекст, в котором выполняются команды. Соответственно, для каждой команды <a href="namespace.html#eval"><strong>namespace eval</strong></a> создается дополнительный уровень в стеке. Поэтому при указании уровня контекста в стеке каждую вложенную команду <a href="namespace.html#eval"><strong>namespace eval</strong></a> надо считать наравне с вызовом процедуры. Это относится также к командам <strong><a href="upvar.html">upvar</a></strong> и <strong><a href="info.html#level">info level</a></strong>. Например, команда</p> <pre> info level 1 </pre> <p>вернет список, описывающий самую верхнюю выполняемую команду, которая является либо вызовом процедуры, либо командой namespace eval. Независимо от использования команда <a href= "namespace.html#eval"><strong>namespace eval</strong></a> команда <strong>uplevel #0</strong> выполнит соответствующий скрипт на уровне глобальных переменных (в глобальном пространстве имен).</p> </body> </html>