Команда source
работает почти так же, как если бы она считывала файл в строку и затем передавала это в eval
(единственная тонкость - в info script
).Это означает, что область, в которой было выполнено source
, будет той, в которой оценивается самый внешний уровень сценария, и поэтому вы можете иметь condition
локальной переменной там:
proc funkystuff {condition} {
source b.tcl
}
funkystuff true
Это будет работать (и на самом деле жизненно важно для работы сценариев определения пакетов Tcl; они оцениваются в контексте, где есть локальная переменная $dir
, которая описывает, где находится определение пакета), но это, безусловно, может привестикод, который сбивает с толку!Поэтому рекомендуется писать сценарии так, чтобы код внутри них не делал предположений о том, в каком контексте они оцениваются. Самый простой способ сделать это - часто помещать код в сценарий в пространство имен, где имяпространства имен полностью определено.
namespace eval ::foobar {
# Do stuff here...
}
Это также хорошая вещь, чтобы попытаться написать код, который не слишком параметризован при поиске, вместо этого сохранить его для любой версии кода, который вы загружаете (например,один файл для Linux, другой для Windows) или какие параметры вы передаете командам.Конечно, у вас нет для такой работы, но это помогает сделать ваш код надежным и легким для понимания.
Наконец, область действия, используемая для основного сценария для интерпретатора Tclвсегда оценивается на глобальном уровне (т. е. в пространстве имен ::
без родительской области).