100 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | ||
| <html>
 | ||
|   <head>
 | ||
|     <title>upvar</title>
 | ||
|   </head>
 | ||
| 
 | ||
|   <body>
 | ||
|     <h1>upvar</h1>
 | ||
| 
 | ||
|     <p>Команда создает связи между переменными различных уровней
 | ||
|       стека.</p>
 | ||
| 
 | ||
|     <h2>СИНТАКСИС</h2>
 | ||
| 
 | ||
|     <pre>
 | ||
|       <strong>upvar</strong> ?<em>level</em>? <em>otherVar</em> <em>myVar</em> ?<em>otherVar</em> <em>myVar</em>...?
 | ||
|     </pre>
 | ||
| 
 | ||
|     <h2>ОПИСАНИЕ</h2>
 | ||
| 
 | ||
|     <p>Команда позволяет одной или больше локальным переменным текущей
 | ||
|       процедуры ссылаться на переменные процедуры, стоящей выше в
 | ||
|       стеке, или на глобальные переменные. Аргумент <em>level</em> может
 | ||
|       иметь те же формы, что и в команде <a
 | ||
|       href="uplevel.html"><strong>uplevel</strong></a>, или быть опущен, если
 | ||
|       первый символ в первой из <em>otherVar</em> отличен от цифры и от
 | ||
|       # (значение по умолчанию 1). Для каждой пары аргументов
 | ||
|       <em>otherVar</em> <em>myVar</em> команда позволяет сделать
 | ||
|       переменную с именем <em>otherVar</em> из указанного уровня стека
 | ||
|       (локальную переменную одной из вызывающих процедур или
 | ||
|       глобальную переменную, если <em>level</em> равно #0) видимой в
 | ||
|       исполняемой процедуре под именем <em>myVar</em>. Переменная с
 | ||
|       именем <em>otherVar</em> не обязана существовать в момент
 | ||
|       исполнения команды. При необходимости она будет создана при
 | ||
|       первом использовании переменной <em>myVar</em>. В момент
 | ||
|       исполнения команды не должно быть доступной переменной myVar.
 | ||
|       Переменная <em>myVar</em> всегда считается простой переменной (не
 | ||
|       массивом и не переменной массива). Даже если значение
 | ||
|       <em>myVar</em> выглядит как имя элемента массива, например, a(b),
 | ||
|       создается простая переменная. Значение <em>otherVar</em> может
 | ||
|       быть именем простой переменной, массива или элемента массива.
 | ||
|       Команда <strong>upvar</strong> всегда возвращает пустую строку.</p>
 | ||
| 
 | ||
|     <p>Команда upvar позволяет упростить передачу параметра по ссылке,
 | ||
|       а также упрощает создание новых управляющий
 | ||
|       конструкций. Например, рассмотрим следующую процедуру:</p>
 | ||
|     <pre>
 | ||
|       proc add2 name { 
 | ||
|       	upvar $name x
 | ||
|         set x [expr $x+2]
 | ||
|       }
 | ||
|     </pre>
 | ||
|     <p>Процедура <strong>add2</strong> вызывается с аргументом, содержащим имя
 | ||
|       переменной и увеличивает значение этой переменной на два.  Хотя
 | ||
|       тот же результат мог быть получен с помощью команды uplevel,
 | ||
|       команда <strong>upvar</strong> позволяет легче работать с переменными из
 | ||
|       стека вызывающей процедуры.</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> надо
 | ||
|         считать наравне с вызовом процедуры. Это относится также к
 | ||
|         командам <a href="uplevel.html"><strong>uplevel</strong></a> и <a
 | ||
|         href="info.html#level"><strong>info level</strong></a>.  Например,
 | ||
|         команда <strong><a href="info.html#level">info level</a> 1</strong>
 | ||
|         вернет список, описывающий самую верхнюю выполняемую команду,
 | ||
|         которая является либо вызовом процедуры, либо командой <a
 | ||
|         href="namespace.html#eval"><strong>namespace eval</strong></a>.
 | ||
|         Независимо от использования команда <a href=
 | ||
|         "namespace.html#eval"><strong>namespace eval</strong></a> команда
 | ||
|         <strong>uplevel #0</strong> выполнит соответствующий скрипт на уровне
 | ||
|         глобальных переменных (в глобальном пространстве имен).</p>
 | ||
| 
 | ||
|     <p>Если переменная, созданная с помощью команды <strong>upvar</strong>,
 | ||
|         удаляется (например, если добавить в процедуру <strong>add2</strong>
 | ||
|         строку unset x), то реально будет удалена переменная,
 | ||
|         связанная с x, а не сама переменная x. Нет никакого способа
 | ||
|         удалить созданные таким образом переменные, кроме как выйти из
 | ||
|         процедуры, в которой они были созданы. Тем не менее, возможно
 | ||
|         связать переменную верхнего уровня с другой локальной
 | ||
|         переменной, выполнив еще одну команду <strong>upvar</strong>.</p>
 | ||
| 
 | ||
|     <h2>ОШИБКИ</h2>
 | ||
| 
 | ||
|     <p>Если <em>otherVar</em> есть элемент массива, то отслеживание
 | ||
|         массива в целом, заданной командой <a href=
 | ||
|         "trace.html"><strong>trace</strong></a>, не сработает при действиях с
 | ||
|         <em>myVar</em> (однако, если отслеживание было задано на
 | ||
|         отдельный элемент массива, оно сработает). В частности,
 | ||
|         изменения, сделанные с помощью <em>myVar</em> в массиве <a
 | ||
|         href="tclvars.html#env"><strong>env</strong></a>, не будут корректно
 | ||
|         переданы подпроцессу.
 | ||
|     </p>
 | ||
|   </body>
 | ||
| </html>
 | 
