projman/hlp/ru/tcl/uplevel.html
2018-02-05 17:23:37 +03:00

94 lines
6.2 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>