Вам не хватает нескольких частей головоломки. Несмотря на то, что вы объявили proc A
в файле, который является частью пакета, A
по-прежнему создается глобально.
Команда package
действительно просто помогает tcl определить, какой файл для источника. Обычно вы хотите смешать package provide
с namespace
package provide abc
namespace eval ::abc {
proc A {} {puts stdout "I am in namespace [namespace current]"}
proc B {} {..}
proc C {} {..}
}
Для того, чтобы вызвать эту функцию вы могли бы сказать
::abc::A
внутри тела A
вы можете сказать, что пространство имен вы в систему с помощью namespace current
Альтернативный способ записи будет
namespace eval ::abc {}
proc ::abc::A {} {puts stdout "I am in namespace [namespace current]"}
proc ::abc::B {} {..}
proc ::abc::C {} {..}
Между пакетами и пространствами имен не существует сопоставления между собой. Таким образом, один пакет может создать много пространств имен (или как в вашем примере, без пространств имен).
Заканчивать эту страницу для того, как создавать библиотеки: http://www.tcl.tk/man/tcl8.5/tutorial/Tcl31.html
И эту страницу для получения полной инструкции по package
и namespace
http://www.tcl.tk/man/tcl8.6/TclCmd/contents.htm
No. Вы можете предоставить несколько различных пакетов в одном файле. 'info script',' info level' и 'info frame' могут помочь, но они не предоставляют имя пакета. –