94 lines
6.2 KiB
HTML
94 lines
6.2 KiB
HTML
<!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>
|
||
|