2018-02-05 17:22:04 +03:00
|
|
|
|
<!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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Команда выполняет скрипт в контексте, отличном от текущего.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>ОПИСАНИЕ</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Все аргументы команды объединяются как при выполнении команды
|
|
|
|
|
<a href=concat.html><strong>concat</strong></a>. Получившийся скрипт
|
|
|
|
|
выполняется в контексте, указанном <em>level</em>. Команда
|
|
|
|
|
возвращает результат выполнения скрипта.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +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
|
|
|
|
|
2018-02-05 17:22:04 +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
|
|
|
|
|
2018-02-05 17:22:04 +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>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Команда <strong>uplevel</strong> позволяет создавать новые управляющие
|
|
|
|
|
конструкции как Tcl-процедуры.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +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>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
|