projman/hlp/ru/tcl/uplevel.html

94 lines
6.2 KiB
HTML
Raw Normal View History

<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
2015-10-19 13:27:31 +03:00
<html>
<head>
<title>uplevel</title>
</head>
<body>
<h1>uplevel</h1>
<p> Команда выполняет скрипт в контексте, отличном от текущего.</p>
2015-10-19 13:27:31 +03:00
<h2>СИНТАКСИС</h2>
2015-10-19 13:27:31 +03:00
<pre>
<strong>uplevel</strong> ?<em>level</em>? <em>arg</em> ?<em>arg</em>...?
</pre>
<h2>ОПИСАНИЕ</h2>
2015-10-19 13:27:31 +03:00
<p>Все аргументы команды объединяются как при выполнении команды
<a href=concat.html><strong>concat</strong></a>. Получившийся скрипт
выполняется в контексте, указанном <em>level</em>. Команда
возвращает результат выполнения скрипта.</p>
2015-10-19 13:27:31 +03:00
<p>Если аргумент <em>level</em> задан как целое число, он указывает
на сколько уровней выше уровня контекста текущей процедуры надо
подняться в стеке вызовов перед выполнением скрипта. Если
аргумент <em>level</em> задан как символ <strong>#</strong> с последующим
целым числом, то он задает абсолютный уровень контекста в
стеке. Если аргумент <em>level</em> отсутствует, то используется
значение по умолчанию <strong>1</strong>. Аргумент <em>level</em> должен
быть указан, если первый из аргументов arg начинается с цифры
или символа <strong>#</strong>.</p>
2015-10-19 13:27:31 +03:00
<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>
2015-10-19 13:27:31 +03:00
<p>При выполнении команды <strong>uplevel</strong> контекст вызывающей
процедуры временно удаляется из стека вызовов процедур. Так,
если в приведенном выше примере команда <strong>uplevel</strong> имеет
вид</p>
2015-10-19 13:27:31 +03:00
<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>
2015-10-19 13:27:31 +03:00
<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> возвратит уровень текущей процедуры.
2015-10-19 13:27:31 +03:00
<p>Команда <strong>uplevel</strong> позволяет создавать новые управляющие
конструкции как Tcl-процедуры.</p>
2015-10-19 13:27:31 +03:00
<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>
2015-10-19 13:27:31 +03:00
<pre>
info level 1
</pre>
<p>вернет список, описывающий самую верхнюю выполняемую команду,
которая является либо вызовом процедуры, либо командой namespace
eval. Независимо от использования команда <a href=
namespace.html#eval><strong>namespace eval</strong></a> команда
<strong>uplevel #0</strong> выполнит соответствующий скрипт на
уровне глобальных переменных (в глобальном пространстве
имен).</p>
2015-10-19 13:27:31 +03:00
</body>
</html>