2018-02-05 17:22:04 +03:00
|
|
|
|
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>namespace</title>
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body>
|
|
|
|
|
<h1>namespace</h1>
|
|
|
|
|
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Команда предназначена для создания и управления областями имен
|
|
|
|
|
для команд и переменных.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>СИНТАКСИС</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<strong>namespace</strong> ?<em>option</em>? ?<em>arg</em>?
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>ОПИСАНИЕ</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Команда позволяет создавать, обращаться и уничтожать отдельные
|
|
|
|
|
области имен для команд и переменных. Более детально назначение
|
|
|
|
|
и использование команды описаны ниже см.
|
|
|
|
|
<a href=#Пространства имен>Пространства имен</a>.
|
|
|
|
|
Действия, выполняемые командой,
|
|
|
|
|
зависят от значения аргумента <em>option</em>. Ниже приведены
|
|
|
|
|
возможные опции команды.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dl>
|
|
|
|
|
<dt><strong>namespace</strong> <strong>children</strong> ?<em>namespace</em>?
|
|
|
|
|
?<em>pattern</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Позволяет получить список областей-потомков для области имен
|
|
|
|
|
<em>namespace</em>. Если аргумент <em>namespace</em> отсутствует,
|
|
|
|
|
то возвращается список областей-потомков для текущего
|
|
|
|
|
пространства имен. Команда возвращает полные имена,
|
|
|
|
|
начинающиеся с <strong>::</strong>. Если указан аргумент <em>pattern</em>,
|
|
|
|
|
команда возвращает только те имена, которые удовлетворяют
|
|
|
|
|
шаблону <em>pattern</em>. Проверка на соответствие производится
|
|
|
|
|
по тем же правилам, что и в команде <a
|
|
|
|
|
href=glob.html><strong>glob</strong></a>. При этом шаблон,
|
|
|
|
|
начинающийся с <strong>::</strong>, используется непосредственно, в
|
|
|
|
|
противном случае используемый шаблон составляется из
|
|
|
|
|
<em>namespace</em> (или полного имени текущего пространства
|
|
|
|
|
имен) и <em>pattern</em>.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>namespace</strong> <strong>code</strong> <em>script</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd><p>Позволяет захватить контекст текущей области имен для
|
|
|
|
|
скрипта <em>script</em> с тем, чтобы потом использовать этот
|
|
|
|
|
контекст при выполнении данного скрипта. Команда возвращает
|
|
|
|
|
новый скрипт, в котором старый скрипт <em>завернут</em> в
|
|
|
|
|
команду <strong>namespace code</strong>. Новый скрипт имеет две важные
|
|
|
|
|
особенности: во-первых, он может быть вызван в произвольном
|
|
|
|
|
пространстве имен, при этом реально он будет выполняться в
|
|
|
|
|
текущем пространстве имен (том, в котором выполнялась команда
|
|
|
|
|
<strong>namespace code</strong>). Во-вторых, к созданному таким образом
|
|
|
|
|
скрипту можно дописывать произвольные аргументы и они
|
|
|
|
|
действительно будут использоваться как дополнительные
|
|
|
|
|
аргументы. Например, предположим, что команда</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
set script [namespace code {foo bar}]
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>выполняется в пространстве имен <strong>::a::b</strong>. Тогда
|
|
|
|
|
команда</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
eval " x y"
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>может быть выполнена в любом пространстве имен и будет
|
|
|
|
|
иметь тот же эффект, что и команда</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
namespace eval ::a::b {foo bar x y}
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Эта команда необходима потому, что расширения Tcl,
|
|
|
|
|
например, Tk, обычно выполняют вызванные по событиям скрипты в
|
|
|
|
|
глобальном пространстве имен. Обертывающая команда захватывает
|
|
|
|
|
необходимую команду вместе с ее пространством имен и позволяет
|
|
|
|
|
корректно выполнить ее позже по соответствующему
|
|
|
|
|
вызову. Примеры использования данного механизма приведены ниже
|
|
|
|
|
см. <a href=#ПРАВИЛА ВИДИМОСТИ ИМЕН>Правила
|
|
|
|
|
видимости имен</a>.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>namespace current</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Позволяет получить полное имя текущей области имен. Хотя
|
|
|
|
|
реальное имя глобального пространства имен ""
|
|
|
|
|
(пустая строка), эта команда возвращает для него <strong>::</strong>,
|
|
|
|
|
поскольку это часто бывает удобнее при программировании.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>namespace</strong> <strong>delete</strong> ?<em>namespace</em>
|
|
|
|
|
<em>namespace</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Позволяет удалить одну или несколько областей имен, при этом
|
|
|
|
|
удаляются все переменные, процедуры и области-потомки заданной
|
|
|
|
|
области имен. Если внутри одного из удаляемых пространств имен
|
|
|
|
|
выполняется какая-либо процедура, оно будет сохранено до
|
|
|
|
|
завершения процедуры, но помечено, как приготовленное к
|
|
|
|
|
удалению, чтобы исключить вызов других процедур. Если
|
|
|
|
|
указанное пространство имен не существует, команда возвращает
|
|
|
|
|
ошибку. Если ни одно пространство имен не указано, команда не
|
|
|
|
|
делает ничего.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=eval></a><strong>namespace</strong> <strong>eval</strong>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<em>namespace</em> <em>arg</em> ?<em>arg</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Позволяет активизировать пространство имен <em>namespace</em>
|
|
|
|
|
и выполнить в его контексте заданный код. Если пространство
|
|
|
|
|
имен <em>namespace</em> не существует, оно будет создано. Если
|
|
|
|
|
пространство имен должно быть предком несуществующего
|
|
|
|
|
пространства имен, то оно тоже создается. Если задано более
|
|
|
|
|
одного аргумента, все они объединяются в одну строку через
|
|
|
|
|
пробел (как при выполнении команды <a href=
|
|
|
|
|
eval.html><strong>eval</strong></a>) и полученный скрипт
|
|
|
|
|
выполняется.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>namespace</strong> <strong>export</strong> ?<strong>-clear</strong>?
|
|
|
|
|
?<em>pattern</em> <em>pattern</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Позволяет указать, какие команды разрешено экспортировать из
|
|
|
|
|
данного пространства имен. Эти команды потом могут быть
|
|
|
|
|
импортированы в другие пространства имен с помощью команды
|
|
|
|
|
<strong>namespace</strong> <strong>import</strong>. Можно разрешать экспорт как
|
|
|
|
|
команд, созданных в данном пространстве имен, так и команд,
|
|
|
|
|
ранее импортированных из других пространств. Команда,
|
|
|
|
|
разрешаемая для экспорта, может в данный момент не
|
|
|
|
|
существовать. Каждый из шаблонов <em>pattern</em> может
|
|
|
|
|
содержать специальные символы как в команде <a href=
|
|
|
|
|
glob.html><strong>glob</strong></a>, но не может содержать имени
|
|
|
|
|
пространства имен. То есть шаблон может указывать команды
|
|
|
|
|
только в текущем пространстве имен. Каждый из шаблонов
|
|
|
|
|
добавляется к списку шаблонов команд, разрешенных для импорта
|
|
|
|
|
из данного пространства имен. Если в команде указан флаг
|
|
|
|
|
<strong>-clear</strong>, команда предварительно удаляет старый
|
|
|
|
|
список. Если не указаны ни флаг, ни шаблоны, команда
|
|
|
|
|
возвращает текущий список шаблонов.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>namespace</strong> <strong>forget</strong> ?<em>pattern</em>
|
|
|
|
|
<em>pattern</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Удаляет из пространства имен ранее импортированные команды.
|
|
|
|
|
Каждый образец <em>pattern</em> должен быть полным именем
|
|
|
|
|
команды с указанием хотя бы одного пространства имен и может
|
|
|
|
|
содержать специальные символы, как в команде <a
|
|
|
|
|
href=glob.html><strong>glob</strong></a>, например: <strong>foo::x</strong>
|
|
|
|
|
или <strong>a::b::p*</strong>. Специальные символы нельзя использовать в
|
|
|
|
|
именах пространств имен. При выполнении данной команды сначала
|
|
|
|
|
ищутся команды, удовлетворяющие шаблону и разрешенные к
|
|
|
|
|
экспорту из соответствующих пространств имен. Далее
|
|
|
|
|
проверяется, какие из них были импортированы в текущее
|
|
|
|
|
пространство имен. После чего импортированные команды
|
|
|
|
|
удаляются. То есть команда выполняет действия, противоположные
|
|
|
|
|
действиям команды <strong>namespace import</strong>.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=import></a><strong>namespace</strong>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<strong>import</strong> ?<strong>-force</strong>? ?<em>pattern</em> <em>pattern</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Импортирует команды в текущее пространство имен. Каждый
|
|
|
|
|
образец <em>pattern</em> должен быть полным именем команды с
|
|
|
|
|
указанием хотя бы одного пространства имен и может содержать
|
|
|
|
|
специальные символы, как в команде <a href=
|
|
|
|
|
glob.html><strong>glob</strong></a>, например <strong>foo::x</strong> или
|
|
|
|
|
<strong>a::b::p*</strong>. Специальные символы нельзя использовать в
|
|
|
|
|
именах пространств имен. Все команды, которые удовлетворяют
|
|
|
|
|
шаблонам и разрешены для экспорта, добавляются к текущему
|
|
|
|
|
пространству имен. Для этого в текущем пространстве имен
|
|
|
|
|
создается новая команда, которая указывает на экспортируемую
|
|
|
|
|
команду в исходном пространстве имен. При вызове этой новой
|
|
|
|
|
команды она вызывает исходную команду. Если в текущем
|
|
|
|
|
пространстве имен уже есть команда с таким именем,
|
|
|
|
|
возвращается ошибка, если не указана опция <strong>-force</strong>. В
|
|
|
|
|
противном случае импортируемая команда заменяет команду,
|
|
|
|
|
определенную ранее. Команда <strong>namespace import</strong>
|
|
|
|
|
импортирует в текущее пространство имен только те функции,
|
|
|
|
|
которые в момент исполнения существуют в соответствующем
|
|
|
|
|
пространстве имен. Если позже там будут созданы новые команды
|
|
|
|
|
с именами, удовлетворяющими шаблонам, разрешающим экспорт, и
|
|
|
|
|
шаблонам, определяющим импорт, то они не импортируются
|
|
|
|
|
автоматически.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>namespace</strong> <strong>inscope</strong> <em>namespace</em> <em>arg</em>
|
|
|
|
|
?<em>arg</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd><p>Выполняет скрипт в контексте пространства имен
|
|
|
|
|
<em>namespace</em>. Эта команда не предназначена для
|
|
|
|
|
непосредственного исполнения программистом. Ее вызовы
|
|
|
|
|
создаются автоматически при использовании команды
|
|
|
|
|
<strong>namespace code</strong> для создания скриптов, выполняемых в
|
|
|
|
|
фоновом режиме, например, для Tk-виджетов. Команда
|
|
|
|
|
<strong>namespace inscope</strong> похожа на команду <strong>namespace
|
|
|
|
|
eval</strong>, но отличается от нее наличием возможности
|
|
|
|
|
указывать дополнительные аргументы и тем, что пространство
|
|
|
|
|
имен <em>namespace</em> должно существовать в момент
|
|
|
|
|
выполнения команды. При выполнении команды первый аргумент
|
|
|
|
|
рассматривается как список, к которому остальные аргументы
|
|
|
|
|
добавляются как элементы списка. Так команда</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
namespace inscope ::foo a x y z
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>эквивалентна</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
namespace eval ::foo [concat a [list x y z]]
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Такая семантика весьма удобна при формировании скриптов,
|
|
|
|
|
выполняемых в фоновом режиме.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>namespace</strong> <strong>origin</strong> <em>command</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Возвращает полное имя оригинальной команды <em>command</em>,
|
|
|
|
|
от которой происходит заданная импортированная команда. При
|
|
|
|
|
импорте команды в текущем пространстве имен создается новая
|
|
|
|
|
команда, которая указывает на экспортируемую команду в
|
|
|
|
|
исходном пространстве имен. Если команда последовательно
|
|
|
|
|
импортировать в пространства имен <em>a</em>, <em>b</em>, ...,
|
|
|
|
|
<em>n</em>, причем в каждое последующее пространство имен она
|
|
|
|
|
импортировалась из предыдущего, то <strong>namespace origin</strong>
|
|
|
|
|
вернет полное имя команды в первом пространстве имен, то есть
|
|
|
|
|
<em>a</em>. Если команда <em>command</em> не импортирована, то
|
|
|
|
|
<strong>namespace origin</strong> вернет ее полное имя.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>namespace</strong> <strong>parent</strong> ?<em>namespace</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Возвращает полное имя родительского пространства имен для
|
|
|
|
|
пространства <em>namespace</em>. Если аргумент <em>namespace</em>
|
|
|
|
|
не указан, возвращает полное имя предка текущего пространства
|
|
|
|
|
имен.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>namespace</strong> <strong>qualifiers</strong> <em>string</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Возвращает полное имя пространства имен для <em>string</em>,
|
|
|
|
|
то есть часть строки <em>string</em> от начала до последнего
|
|
|
|
|
символа <strong>::</strong> (но не включая его). Например, для строки
|
|
|
|
|
<strong>::foo::bar::x</strong> эта команда вернет <strong>::foo::bar</strong>, а
|
|
|
|
|
для <strong>::</strong> - "" (пустую строку). Команда является
|
|
|
|
|
парной для команды <strong>namespace tail</strong>. При выполнении
|
|
|
|
|
команды проверка существования соответствующих пространств
|
|
|
|
|
имен не производится.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>namespace</strong> <strong>tail</strong> <em>string</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Возвращает простое имя, завершающее полное имя
|
|
|
|
|
<em>string</em>, то есть часть строки <em>string</em> от
|
|
|
|
|
последнего символа <strong>::</strong> (но не включая его) до конца
|
|
|
|
|
строки. Например, для строки <strong>::foo::bar::x</strong> эта
|
|
|
|
|
команда вернет <strong>x</strong>, а для <strong>::</strong> - ""
|
|
|
|
|
(пустую строку). Команда является парной для команды
|
|
|
|
|
<strong>namespace qualifiers</strong>. При выполнении команды проверка
|
|
|
|
|
существования соответствующих пространств имен не
|
|
|
|
|
производится.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>namespace</strong> <strong>which</strong> ?<strong>-command</strong>?
|
|
|
|
|
?<strong>-variable</strong>? <em>name</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Рассматривает <em>name</em> как имя команды или переменной (в
|
|
|
|
|
зависимости от указанной опции; по умолчанию - как имя
|
|
|
|
|
команды) и возвращает ее полное имя. Например, если
|
|
|
|
|
<em>name</em> не существует в текущем пространстве имен, но
|
|
|
|
|
существует в глобальном, то возвращает полное имя в глобальном
|
|
|
|
|
пространстве имен. Если команда или переменная не существует,
|
|
|
|
|
данная команда возвращает пустую строку. Более подробно
|
|
|
|
|
правила поиска имен см. <a href=
|
|
|
|
|
#ПРАВИЛА ВИДИМОСТИ ИМЕН>Правила видимости имен</a>.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dl>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=ЧТО ТАКОЕ ПРОСТРАНСТВО ИМЕН?></a>ЧТО ТАКОЕ
|
|
|
|
|
ПРОСТРАНСТВО ИМЕН?</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Пространство имен - это обособленный набор команд и
|
|
|
|
|
переменных. Содержащиеся в нем команды и переменные не
|
|
|
|
|
взаимодействуют с командами и переменными в других пространствах
|
|
|
|
|
имен. В Tcl всегда был один такой набор, который мы будем
|
|
|
|
|
называть глобальным пространством имен. В нем содержатся все
|
|
|
|
|
глобальные переменные и команды. Команда <strong>namespace eval</strong>
|
|
|
|
|
позволяет создавать другие пространства имен, например, команда
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
namespace eval Counter {
|
|
|
|
|
namespace export Bump
|
|
|
|
|
variable num 0
|
|
|
|
|
proc Bump {} {
|
|
|
|
|
variable num
|
|
|
|
|
incr num
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>создает новое пространство имен, содержащее переменную
|
|
|
|
|
<strong>num</strong> и процедуру <strong>Bump</strong>. Команды и переменные в этом
|
|
|
|
|
пространстве имен изолированы от других команд и имен в той же
|
|
|
|
|
программе. Например, в глобальном пространстве имен может
|
|
|
|
|
существовать другая команда <strong>Bump</strong>.</p>
|
|
|
|
|
|
|
|
|
|
<p>Переменные пространства имен напоминают глобальные
|
|
|
|
|
переменные. Они существуют вне процедур, но могут использоваться
|
|
|
|
|
в процедурах с помощью команды <a href=
|
|
|
|
|
variable.html><strong>variable</strong></a>, как показано в
|
|
|
|
|
предыдущем примере.</p>
|
|
|
|
|
|
|
|
|
|
<p>Пространства имен - динамические образования. В них можно
|
|
|
|
|
в любой момент добавлять команды и переменные с помощью
|
|
|
|
|
дополнительных команд <strong>namespace eval</strong>. Например, то же
|
|
|
|
|
пространство имен, что и в предыдущем примере, можно было
|
|
|
|
|
создать с помощью последовательности команд:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
namespace eval Counter {
|
|
|
|
|
variable num 0
|
|
|
|
|
proc Bump {} {
|
|
|
|
|
variable num
|
|
|
|
|
return [incr num]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
namespace eval Counter {
|
|
|
|
|
proc test {args} {
|
2018-02-05 17:22:04 +03:00
|
|
|
|
return
|
2015-10-19 13:27:31 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace eval Counter {
|
|
|
|
|
rename test ""
|
|
|
|
|
}
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Обратите внимание, что процедура <strong>test</strong> создана в
|
|
|
|
|
пространстве имен <strong>Counter</strong>, а затем удалена с помощью
|
|
|
|
|
команды <a href=rename.html><strong>rename</strong></a>.
|
|
|
|
|
|
|
|
|
|
<p>Пространства имен могут иметь собственные вложенные
|
|
|
|
|
пространства имен и образовывать иерархию пространств имен.
|
|
|
|
|
Вложенное пространство имен содержится в своем предке и не может
|
|
|
|
|
взаимодействовать с другими пространствами имен.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h2><a name=ПОЛНЫЕ ИМЕНА></a>ПОЛНЫЕ ИМЕНА</h2>
|
|
|
|
|
|
|
|
|
|
<p>Каждое пространство имен имеет собственное имя, например <a
|
|
|
|
|
href=history.html><strong>history</strong></a> или
|
|
|
|
|
<strong>::safe::interp</strong>. Полные имена используются для указания
|
|
|
|
|
команд, переменных или подпространств имен, содержащихся в
|
|
|
|
|
соответствующем пространстве имен. Полные имена напоминают
|
|
|
|
|
полные имена файлов в Unix или виджетов в Tk, но в качестве
|
|
|
|
|
разделителей в них используется не слэш или точка, а двойное
|
|
|
|
|
двоеточие "<strong>::</strong>". Самое верхнее или глобальное
|
|
|
|
|
пространство имен имеет имя "" (пустая строка) и
|
|
|
|
|
<strong>::</strong> как синоним. Как пример, имя
|
|
|
|
|
<strong>::safe::interp::create</strong> ссылается на команду <strong>create</strong>
|
|
|
|
|
в пространстве имен <a href=interp.html><strong>interp</strong></a>,
|
|
|
|
|
которое является подпространством пространства имен
|
|
|
|
|
<strong>::safe</strong>, которое в свою очередь является подпространством
|
|
|
|
|
глобального пространства имен <strong>::</strong>.</p>
|
|
|
|
|
|
|
|
|
|
<p>Если вы хотите указать команду или переменную в другом
|
|
|
|
|
пространстве имен, вы можете указать имя пространства имен, в
|
|
|
|
|
котором она содержится. Например, из глобального пространства
|
|
|
|
|
имен вызвать процедуру из пространства имен <strong>Counter</strong>
|
|
|
|
|
можно следующим образом:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
Counter::Bump 5
|
|
|
|
|
Counter::Reset
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>А вывести текущее значение переменной <em>count</em> можно с
|
|
|
|
|
помощью команды</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
puts "count = ::num"
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Если одно пространство имен содержит другое, может понадобиться
|
|
|
|
|
более длинное имя. Если пространство имен <strong>Foo</strong> содержит
|
|
|
|
|
пространство имен <strong>Counter</strong>, то чтобы вызвать процедуру
|
|
|
|
|
<strong>Bump</strong> в последнем из глобального пространства имен, нужно
|
|
|
|
|
воспользоваться именем</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
Foo::Counter::Bump 3
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Полное имя может использоваться при создании или переименовании
|
|
|
|
|
команд. Например, можно добавить процедуру в пространство имен
|
|
|
|
|
<strong>Foo</strong> следующей командой:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
proc Foo::Test {args} { return }
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>А переопределить ее в другом пространстве имен командой:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
rename Foo::Test Bar::Test
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Дополнительные замечания. Имена пространств имен, за
|
|
|
|
|
исключением глобального, не могут быть пустой строкой.
|
|
|
|
|
Сочетание <strong>::</strong> запрещено в именах простых команд,
|
|
|
|
|
переменных и пространств имен кроме как в роли разделителя имен
|
|
|
|
|
пространств имен. Дополнительные символы <strong>:</strong> в полных
|
|
|
|
|
именах игнорируются, то есть два или больше символов <strong>:</strong>
|
|
|
|
|
подряд считаются одним разделителем. Сочетание <strong> ::</strong> в
|
|
|
|
|
конце имени команды или переменной указывает на команду или
|
|
|
|
|
переменную с именем <strong>{}</strong> (пустая строка). Однако в полном
|
|
|
|
|
имени пространства имен <strong>::</strong> на конце игнорируется.</p>
|
|
|
|
|
|
|
|
|
|
<h2><a name=ПРАВИЛА ВИДИМОСТИ ИМЕН></a>ПРАВИЛА ВИДИМОСТИ ИМЕН</h2>
|
|
|
|
|
|
|
|
|
|
<p>Все Tcl-команды, которые работают с именами переменных и
|
|
|
|
|
команд, поддерживают полные имена. Это значит, что можно
|
|
|
|
|
использовать полные имена в таких командах, как <a href=
|
|
|
|
|
seek.html><strong>set</strong></a>, <a
|
|
|
|
|
href=proc.html><strong>proc</strong></a>, <a
|
|
|
|
|
href=rename.html><strong>rename</strong></a>, или <a href=
|
|
|
|
|
interp.html#alias><strong>interp alias</strong></a>. Если вы
|
|
|
|
|
используете абсолютное имя, начинающееся с <strong>::</strong>, то такое
|
|
|
|
|
имя всегда интерпретируется однозначно. Однако, если вы
|
|
|
|
|
используете относительное имя, не начинающееся с <strong>::</strong>,
|
|
|
|
|
поиск объекта с соответствующим именем происходит по следующим
|
|
|
|
|
правилам: команды и переменные сначала ищутся в текущем
|
|
|
|
|
пространстве имен, а затем (если не найдены) - в
|
|
|
|
|
глобальном. Имена пространств имен ищутся только в текущем
|
|
|
|
|
пространстве имен.</p>
|
|
|
|
|
|
|
|
|
|
<p>В следующем примере</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
set traceLevel 0
|
|
|
|
|
namespace eval Debug {
|
2018-02-05 17:22:04 +03:00
|
|
|
|
printTrace
|
2015-10-19 13:27:31 +03:00
|
|
|
|
}
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Tcl ищет переменную <strong>traceLevel</strong> в пространстве имен <strong>
|
|
|
|
|
Debug</strong> и затем в глобальном пространстве имен. Аналогично
|
|
|
|
|
ищется и процедура <strong>printTrace</strong>. Чтобы не оставлять
|
|
|
|
|
неясностей, рассмотрим еще один пример:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
set traceLevel 0
|
|
|
|
|
namespace eval Foo {
|
|
|
|
|
variable traceLevel 3
|
|
|
|
|
namespace eval Debug {
|
2018-02-05 17:22:04 +03:00
|
|
|
|
printTrace
|
2015-10-19 13:27:31 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Здесь Tcl ищет переменную <strong>traceLevel</strong> в пространстве имен
|
|
|
|
|
<strong>Foo::Debug</strong>. Поскольку там ее нет, он продолжает поиск в
|
|
|
|
|
глобальном пространстве имен. Переменная <strong>Foo::traceLevel</strong>
|
|
|
|
|
в процессе поиска полностью игнорируется.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Чтобы разобраться в сложных ситуациях, можно использовать
|
|
|
|
|
команду <strong>namespace which</strong>. Например, следующая команда:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
namespace eval Foo::Debug {namespace which -variable traceLevel}
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>вернет <strong>::traceLevel</strong>. С другой стороны, команда:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
namespace eval Foo {namespace which -variable traceLevel}
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>вернет <strong>::Foo::traceLevel</strong>.</p>
|
|
|
|
|
|
|
|
|
|
<p>Как уже упоминалось, относительные имена пространств имен
|
|
|
|
|
ищутся иначе, чем имена команд и переменных. Они ищутся только в
|
|
|
|
|
текущем пространстве имен. Это значит, что, например, команда
|
|
|
|
|
<strong>namespace eval</strong> всегда создает потомка текущего
|
|
|
|
|
пространства имен, если только имя нового пространства не
|
|
|
|
|
начинается с <strong>::</strong>.</p>
|
|
|
|
|
|
|
|
|
|
<p>Tcl не ограничивает доступ к командам, переменным или
|
|
|
|
|
пространствам имен. Если вы указали имя, которое в соответствие
|
|
|
|
|
с перечисленными выше правилами ссылается на нужный вам элемент,
|
|
|
|
|
вы можете использовать этот элемент.</p>
|
|
|
|
|
|
|
|
|
|
<p>Переменные, определенные в данном пространстве имен, можно
|
|
|
|
|
использовать в процедурах в этом же пространстве имен с помощью
|
|
|
|
|
команды <a href=variable.html><strong>variable</strong></a>. Похожая на
|
|
|
|
|
команду <a href=global.html><strong>global</strong></a>, эта команда
|
|
|
|
|
создает связь между локальной переменной в процедуре и
|
|
|
|
|
одноименной переменной в пространстве имен. Если необходимо, эта
|
|
|
|
|
команда также создает и инициализирует эту переменную (команда
|
|
|
|
|
<a href=global.html><strong>global</strong></a> только создает связь
|
|
|
|
|
с переменной в глобальном пространстве имен). Команду <a
|
|
|
|
|
href=variable.html><strong>variable</strong></a> можно не
|
|
|
|
|
использовать, если вы всегда используете полное имя
|
|
|
|
|
переменной.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>ИМПОРТ КОМАНД</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Пространств имен часто используются для создания
|
|
|
|
|
библиотек. Некоторые библиотечные команды могут использоваться
|
|
|
|
|
так часто, что необходимость использования полных имен станет
|
|
|
|
|
раздражать. Например, если все команды в такой библиотеке, как
|
|
|
|
|
BLT, содержатся в пространстве имен <strong>Blt</strong>. Тогда вы смогли
|
|
|
|
|
бы использовать их только следующим образом:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
Blt::graph .g -background red
|
|
|
|
|
Blt::table .g 0,0
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Если Вы используете команды <strong>graph</strong> и <strong>table</strong>
|
|
|
|
|
регулярно, предпочтительнее использовать их без префикса
|
|
|
|
|
<strong>Blt::</strong>. Для этого достаточно импортировать эти команды в
|
|
|
|
|
текущее пространство имен, например, следующим образом:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
namespace import Blt::*
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>В результате выполнения этой команды все команды из
|
|
|
|
|
пространства имен <strong>Blt</strong> будут экспортированы в текущее
|
|
|
|
|
пространство имен, и вы сможете использовать их без
|
|
|
|
|
соответствующего префикса:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
graph .g -background red
|
|
|
|
|
table .g 0,0
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Команда <strong>namespace import</strong> импортирует только те команды,
|
|
|
|
|
экспорт которых разрешен с помощью команды <strong>namespace
|
2015-10-19 13:27:31 +03:00
|
|
|
|
export</strong>.</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Как правило, не стоит импортировать все команды из пространства
|
|
|
|
|
имен, так как при этом может быть сложно отследить все команды,
|
|
|
|
|
которые вы получите. Лучше указать явно, какие именно команды
|
|
|
|
|
вам нужны. Например, команда</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
namespace import Blt::graph Blt::table
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>импортирует только команды <strong>graph</strong> и <strong>table</strong>.</p>
|
|
|
|
|
|
|
|
|
|
<p>Если вы попытаетесь импортировать команду, которая уже
|
|
|
|
|
существует в текущем пространстве имен, то вы получите
|
|
|
|
|
ошибку. Это предупредит, например, попытки скопировать одну и ту
|
|
|
|
|
же команду из двух разных библиотек. Однако время от времени
|
|
|
|
|
(например, при отладке) у вас может появиться желание преодолеть
|
|
|
|
|
данное ограничение. Для этого нужно указать в команде опцию
|
|
|
|
|
<strong>-force</strong>, и тогда существующая команда будет заменена на
|
|
|
|
|
импортируемую команду без сообщения об ошибке:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
namespace import -force Blt::graph Blt::table
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Если вам почему-либо надо прекратить использование библиотечной
|
|
|
|
|
команды, это можно сделать следующим образом:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
namespace forget Blt::*
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Эта команда ищет в текущем пространстве имен все команды,
|
|
|
|
|
импортированные из <strong>Blt</strong>, и удаляет их. Если таких
|
|
|
|
|
команд не оказалось, команда ничего не делает. После
|
|
|
|
|
исполнения команды <strong>namespace forget Blt::*</strong> команды из
|
|
|
|
|
пространства имен <em>Blt</em> можно использовать только с
|
|
|
|
|
префиксом <strong>Blt::</strong>.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Если вы удаляете команду из того пространства имен, где она
|
|
|
|
|
была создана, например:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
rename Blt::graph ""
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>то она будет удалена из всех пространств имен, в которые она
|
|
|
|
|
была импортирована.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=ЭКСПОРТ КОМАНД></a>ЭКСПОРТ КОМАНД</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Вы можете разрешить экспорт команд из определенного
|
|
|
|
|
пространства имен:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
namespace eval Counter {
|
|
|
|
|
namespace export Bump Reset
|
|
|
|
|
variable num 0
|
|
|
|
|
variable max 100
|
|
|
|
|
proc Bump {{by 1}} {
|
|
|
|
|
variable num
|
2018-02-05 17:22:04 +03:00
|
|
|
|
incr num
|
2015-10-19 13:27:31 +03:00
|
|
|
|
check
|
2018-02-05 17:22:04 +03:00
|
|
|
|
return
|
2015-10-19 13:27:31 +03:00
|
|
|
|
}
|
|
|
|
|
proc Reset {} {
|
|
|
|
|
variable num
|
|
|
|
|
set num 0
|
|
|
|
|
}
|
|
|
|
|
proc check {} {
|
|
|
|
|
variable num
|
|
|
|
|
variable max
|
2018-02-05 17:22:04 +03:00
|
|
|
|
if { > } {
|
2015-10-19 13:27:31 +03:00
|
|
|
|
error "too high!"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>После этого процедуры <strong>Bump</strong> и <strong>Reset</strong> можно
|
|
|
|
|
импортировать, например, с помощью команды:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
namespace import Counter::*
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Но экспорт процедуры <strong>check</strong> не разрешен, и она не будет
|
|
|
|
|
импортирована этой командой.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Команда <strong>namespace import</strong> позволяет импортировать
|
|
|
|
|
только те команды, которые разрешено экспортировать из их
|
|
|
|
|
пространства имен с помощью команды <strong>namespace export</strong>.
|
|
|
|
|
Если в команде <strong>namespace import</strong> указана команда,
|
|
|
|
|
которую нельзя экспортировать, она не будет импортирована в
|
|
|
|
|
соответствующее пространство имен.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
|