# trace

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

## СИНТАКСИС

          trace option ?arg arg...?

## ОПИСАНИЕ

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

trace variable name ops command

  Обеспечивает выполнение команды command при определенных действиях с переменной name. Ниже перечислены возможные значения аргумента ops и какие действия с переменной при этом отслеживаются. Аргумент name может содержать имя простой переменной, имя элемента массива или имя массива. Если name содержит имя массива, то команда command выполняется при соответствующих действиях с любым элементом массива.

  Аргумент ops состоит из одной или больше букв, перечисленных ниже.

  r | Вызывает команду command при чтении переменной.
  w | Вызывает команду command при присвоении значения переменной.
  u | Вызывает команду command при удалении переменной. Переменная может удаляться как явно (с помощью команды unset), так и неявно (при завершении процедуры). переменная также удаляется при удалении интерпретатора, в котором она была создана. Однако, при этом соответствующая команда не вызывается, так как уже нет интерпретатора, в котором ее можно было бы выполнить.

  Когда срабатывает команда trace, то исполняемая команда command дополняется тремя аргументами, как указано ниже

      	  command name1 name2 op

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

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

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

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

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

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

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

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

  Команда trace variable возвращает пустую строку.

trace vdelete name ops command

  Если задано отслеживание переменной name с перечнем действий ops и командой command, то оно будет удалено. Соответственно команда command никогда не будет вызвана. Команда trace vdelete возвращает пустую строку.

trace vinfo name

  Возвращает список, содержащий по одному элементу для каждого заданного отслеживания для переменной name. Каждый элемент списка содержит два элемента, содержащие значения ops и command из команды trace, которой было задано соответствующее отслеживание. Если переменная name не существует или для нее не задано отслеживания, команда возвращает пустую строку.