<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>trace</title>
  </head>
  <body>
    <h1>trace</h1>

    <p>Команда отслеживает работу с переменными.</p>

    <h2>СИНТАКСИС</h2>

    <pre>
      <strong>trace</strong> <em>option</em> ?<em>arg</em> <em>arg</em>...?
    </pre>

    <h2>ОПИСАНИЕ</h2> 

    <p>Эта команда вызывает выполнение указанных Tcl команда при
      определенных действиях с переменной. Ниже перечислены возможные
      опции команды (допускаются сокращения).</p>

    <dl>

      <dt><strong>trace</strong> <em>variable</em> <em>name</em> <em>ops</em> 
	<em>command</em></dt>

      <dd><p>Обеспечивает выполнение команды <em>command</em> при
	  определенных действиях с переменной <em>name</em>. Ниже
	  перечислены возможные значения аргумента <em>ops</em> и какие
	  действия с переменной при этом отслеживаются. Аргумент
	  <em>name</em> может содержать имя простой переменной, имя
	  элемента массива или имя массива. Если <em>name</em> содержит
	  имя массива, то команда <em>command</em> выполняется при
	  соответствующих действиях с любым элементом массива.</p>
	  <p>Аргумент <em>ops</em> состоит из одной или больше букв,
	  перечисленных ниже.</p>
	<table>
	    <tr>
	      <td><strong>r</strong></td>

	      <td>Вызывает команду command при чтении переменной.</td>
	    </tr>
	    <tr>
          <td><strong>w</strong></td>
	      <td>Вызывает команду command при присвоении значения
		переменной.</td>
	    </tr>
	    <tr>
	      <td><strong>u</strong></td>

	      <td>Вызывает команду <em>command</em> при удалении
		  переменной.  Переменная может удаляться как явно (с
		  помощью команды <strong><a
		  href="unset.html">unset</a></strong>), так и неявно (при
		  завершении процедуры). переменная также удаляется
		  при удалении интерпретатора, в котором она была
		  создана.  Однако, при этом соответствующая команда
		  не вызывается, так как уже нет интерпретатора, в
		  котором ее можно было бы выполнить.
	      </td>
	    </tr>
	</table>

	<p>Когда срабатывает команда <strong>trace</strong>, то исполняемая
	  команда <em>command</em> дополняется тремя аргументами, как
	  указано ниже</p>
	<pre>
	  <strong>command</strong> <em>name1</em> <em>name2</em> <em>op</em><br>
	</pre>

	<p>Здесь <em>name1</em> это имя переменной, действия с которой
	  вызвали срабатывание команды. Если это элемент массива, то
	  <em>name1</em> это имя массива, а <em>name2</em> - имя
	  конкретного элемента массива. В противном случае
	  <em>name2</em> - пустая строка. Если в команде <em>trace</em>
	  было указано имя массива и он удаляется, то <em>name2</em>
	  также будет пустой строкой. Имена в переменных <em>name1</em>
	  и <em>name2</em> не обязано совпадать с теми, что были заданы
	  в команде <strong>trace variable</strong>, поскольку команда <a
	  href="upvar.html"><strong>upvar</strong></a> позволяет процедуре
	  обращаться к переменной по различным именам. Аргумент
	  <em>op</em> указывает какое именно действие выполнялось с
	  переменной и может принимать значения <strong>r</strong>, <strong>w</strong> или
	  <strong>u</strong> как указано выше.
	</p>

	<p>Команда <em>command</em> исполняется в том же контексте, что
	  и код, вызвавший срабатывание <strong>trace</strong>. То есть если
	  действие с переменной выполнялось в процедуре, то команда
	  <em>command</em> может обращаться к локальным переменным этой
	  процедуры. Этот контекст может отличаться от контекста, в
	  котором выполнялась сама команда <strong>trace</strong>. Если команда
	  <em>conmmand</em> есть вызов процедуры (как обычно и бывает),
	  то в процедуре необходимо использовать команду <a href=
	  "upvar.html"><strong>upvar</strong></a> или <a href=
	  "uplevel.html"><strong>uplevel</strong></a> чтобы получить доступ к
	  контролируемой переменной. Как уже говорилось, имена в
	  переменных <em>name1</em> и <em>name2</em>не обязано совпадать с
	  теми, что были заданы в команде <strong>trace variable</a></strong>,
	  поскольку команда <a href="upvar.html"><strong>upvar</strong></a>
	  позволяет процедуре обращаться к переменной по различным
	  именам.</p>

	<p>Если команда <strong>trace</strong> контролирует чтение и запись в
	  переменную, команда <em>command</em> может изменить результат
	  отслеживаемой операции. Если команда <em>command</em> изменяет
	  значение отслеживаемой переменной, то новое значение будет
	  возвращено как результат отслеживаемой операции. Величина,
	  возвращаемая командой <em>command</em>, игнорируется, если
	  только это не ошибка. Тогда отслеживаемая операция также
	  возвращает ошибку с тем же самым сообщением об ошибке,
	  которое было сформировано в команде <em>command</em>, не
	  поясняя, что ошибка произошла в результате отслеживания
	  переменной. Это может приводить к определенным трудностям в
	  определении истиной операции, при выполнении которой
	  возникла ошибка.</p>

	<p>При отслеживании записи в переменную команда <em>command</em>
	  вызывается после того, как значение переменной
	  изменено. Поэтому с ее помощью можно изменить присвоенное
	  значение. Если при этом возвращать исходное значение,
	  переменная окажется доступной только для чтения.</p>

	<p>При выполнении команды <em>command</em> при отслеживании
	  чтения или записи в переменную механизм слежения временно
	  отключается. То есть выполнение этих операций в
	  <em>command</em> не приведет к новых вызовам <em>command</em>.
	  Однако, если в <em>command</em> выполняется удаление
	  переменной, это приводит к соответствующему вызову.</p>

	<p>Когда срабатывает команда trace на удаление переменной,
	  переменная уже удалена. Если удаление переменной произошло
	  вследствие завершения процедуры, команда <em>command</em>
	  вызывается в контексте вызывающей процедуры, поскольку
	  контекст вызвавшейся процедуры уже не существует.
	  Отслеживание не отключается при выполнении <em>command</em> в
	  случае удаления переменной. Поэтому если в <em>command</em>
	  выполняется новая команда <strong>trace</strong> и удаляется
	  соответствующая переменная, выполнится и соответствующая
	  команда command. Ошибки при отслеживании удаления
	  игнорируются.</p>

	<p>Если одна и та же переменная отслеживается с помощью
	  нескольких команда <strong>trace</strong>, то выполняться все
	  соответствующие команды <em>command</em> с учетом порядка
	  выполнения соответствующих команд <strong>trace</strong>. Чем позднее
	  она выполнялась, тем раньше будет выполнена соответствующая
	  команда<em> command</em>. Если одна из команд <em>command</em>
	  при этом возвратит ошибку, остальные команды выполняться не
	  будут. Если одна команда используется для отслеживания
	  элемента массива, а другая - для массива в целом, первой
	  выполняется команда отслеживания массива в целом, а затем
	  уже команда отслеживания элемента.</p>

	<p>Однажды выполненная команда <strong>trace</strong> остается активной
	  пока она не удалена с помощью описанной ниже команды
	  <strong>trace</strong> <em>vdelete</em>, пока не удалена переменная или
	  пока не удален интерпретатор. Удаление элемента массива
	  приведет к прекращению отслеживания этого элемента, но не
	  отслеживания массива в целом.</p>

	<p>Команда <strong>trace variable</strong> возвращает пустую строку.</p>
      </dd>

      <dt><strong>trace</strong> <em>vdelete</em> <em>name</em> <em>ops</em>
	<em>command</em></dt>

      <dd><p>Если задано отслеживание переменной <em>name</em> с
	  перечнем действий <em>ops</em> и командой <em>command</em>, то
	  оно будет удалено. Соответственно команда <em>command</em>
	  никогда не будет вызвана. Команда <strong>trace vdelete</strong>
	  возвращает пустую строку.</p>
      </dd>
      
      <dt><strong>trace</strong> <em>vinfo</em> <em>name</em></dt>

      <dd><p>Возвращает список, содержащий по одному элементу для
	  каждого заданного отслеживания для переменной name. Каждый
	  элемент списка содержит два элемента, содержащие значения
	  <em>ops</em> и <em>command</em> из команды <strong>trace</strong>, которой
	  было задано соответствующее отслеживание. Если переменная
	  name не существует или для нее не задано отслеживания,
	  команда возвращает пустую строку.</p>
      </dd>
    </dl>
  </body>
</html>