94 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!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>
 | ||
| 
 | 
