Формально все команды, которые формируют ядро языка Tcl обеспечиваются Tcl
пакета. Этот пакет необходим для вас до вы запускаете любой код (и должен быть: сама команда package
является одной из этих команд). По историческому соглашению большая часть команд Tcl помещается в глобальное пространство имен, которое находится на пути разрешения команд от всего пространств имен. (Это логически последнее на пути, если явно не задано с namespace path
.) Некоторые команды Tcl определены в пространстве имен ::tcl
, включая справедливое количество внутренних команд, прямой доступ к которым не поддерживается (если он не документирован, он isn ' t, некоторые явно не поддерживаются, но относительно хорошо известны, они находятся в пространстве имен ::tcl::unsupported
). Пространство имен ::oo
(и его дочерние элементы) зарезервировано для TclOO.
Команды, определенные другими пакетами - особенно любые новые пакеты - должны размещаться в пространстве имен с тем же именем, что и пакет. Это просто соглашение и не соблюдается в более старых пакетах (особенно тех, которые предшествуют механизму пространства имен, таких как Tk и TclX), поскольку считается, что это более важно для поддержания обратной совместимости с существующими сценариями, но вы обязательно найдете его проще всего, если вы последуете за ним. Кроме того, обычно принято считать, что глобальное пространство имен принадлежит главным образом к пользовательскому приложению, несмотря на степень загрязнения из других пакетов; он твой, как ты сочтешь нужным.
Экспортируемые команды пространства имен (которые, как правило, должна быть общественными командами пакета с тем же именем) может быть сделан доступным в другом пространстве имен без квалификации с помощью namespace import
:
namespace eval ::foo {
proc grill {} { puts "grill!" }
namespace export grill
}
namespace eval ::bar {
namespace import ::foo::grill
grill
puts [namespace which grill]; # Prints ::bar::grill
puts [namespace origin grill]; # Prints ::foo::grill
}
В качестве альтернативы (от Tcl 8.5) вы можете обновить разрешение путь пространства имен, так оно и выглядит в другом пространстве имен:
namespace eval ::foo {
proc grill {} { puts "grill!" }
}
namespace eval ::bar {
namespace path ::foo
grill
puts [namespace which grill]; # Prints ::foo::grill
puts [namespace origin grill]; # Prints ::foo::grill
}
Обратите внимание, что эти два механизма являются немного по-другому: ш с импортированными командами для команды есть локальный делегат (и поскольку этот делегат на самом деле является командой, вы можете указать rename
и т. д.), тогда как при изменении пути таких делегатов нет; команда в исходном пространстве имен находится непосредственно во время разрешения того, что означает grill
.
В основном, эти команды принадлежат пакету 'Tcl'. Но нет никакой связи между командами и пакетами. –