Я создал это:
# file1.tcl
namespace eval myNS {
namespace ensemble create -command ::make
namespace export cmd1 cmd2 cmd3
}
Я только что понял, что если я добавлю еще одну процедуру cmd4
в свое пространство имен экспорта в другом файле, например:
# file2.tcl
namespace eval myNS {
namespace export cmd4
}
Я тоже могу так написать make cmd4 $args
Мой вопрос: можно ли ограничить его командами cmd1 cmd2 cmd3
?
Вы можете использовать опцию -subcommands
при создании ансамбля, чтобы ограничить то, что доступно вместо значений по умолчанию для всех экспортируемых команд:
namespace eval myNS {
namespace ensemble create -command ::make -subcommands {cmd1 cmd2 cmd3}
namespace export cmd1 cmd2 cmd3
}
После загрузки обоих файлов make cmd4
выдаст ошибку, но myNS::cmd4
все равно можно импортировать с помощью namespace import
или вызвать напрямую; только не через ансамбль.
Вы также можете использовать опцию
-map
, которая позволяет вам полностью контролировать то, что происходит в механизме перезаписи аргументов. (Ансамбли ядра Tcl всегда используют эту опцию; она позволяет компилятору байт-кода делать умные вещи.)