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