Просто для полноты: пространство имен может также использоваться для хранения исходной операции и контроля того, к каким переменным он обращается.
namespace eval TEMP {variable x}
# ... stuff ...
namespace eval TEMP {source script.tcl}
Можно использовать один вызов namespace eval
или, при желании, отдельный вызов.
Есть некоторые тонкости.При записи в переменную внутри namespace eval
(то есть вне области действия процедуры) используется следующий порядок приоритетов:
- запись в существующее имя в текущем пространстве имен
- запись в существующее имя в глобальном пространстве имен
- создание переменной в текущем пространстве имен и запись в нее
(Имена могут существовать, имея значение или появляясь вvariable
вызов команды.)
Порядок чтения переменной:
- чтение из существующего имени в текущем пространстве имен (сбой, если оно не имеет значения)
- чтение из существующего имени в глобальном пространстве имен (сбой, если оно не имеет значения)
- сбой
Это означает, что вы можете «просочиться» переменные из глобального пространства имен вток на , избегая , используя variable
на них.В этом примере доступ к значению переменной list
осуществляется таким образом.Убедившись, что в текущем пространстве имен существует существующее имя, глобальное имя будет затенено и защищено от чтения или записи.
Аналогичным образом можно «вытекать» переменные, убедившись, что для них есть глобальное имя(и снова избегая использования variable
).
Например, если сценарий в script.tcl
равен
# some script with loop on x:
foreach x $list {incr n $x}
, и вы используете его как
set n 0
namespace eval TEMP {source script.tcl}
затем
set n
# => 15
Без set n 0
имя n
вместо этого создается как ::TEMP::n
.