没有全名的调用程序

Call procedure without full name

我写了2个包:
第一个包裹:

# firstpackage.tcl
namespace eval mypackage::firstpackage {}
proc mypackage::firstpackage::myproc {} {
    # ...
}
package provide mypackage::firstpackage 1.0

第二个包裹:

# secondpackage.tcl
namespace eval mypackage::secondpackage {}
proc mypackage::secondpackage::myproc {} {
    # ...
}
package provide mypackage::secondpackage 1.0

我一次调用这 2 个包,如下所示:

# mypackage.tcl
package require mypackage::firstpackage 1.0
package require mypackage::secondpackage 1.0

package provide mypackage 1.0

现在,当我调用 mypackage 1.0 时,我不想这样调用我的过程的全名:

package require mypackage
# set myvar [mypackage::firstpackage::myproc] works...
set myvar [firstpackage::myproc]

我认为这是可能的......但我有这个错误:无效的命令名称“firstpackage::myproc”
我尝试在我的 2 个文件(firstpackage.tcl 和 secondpackage.tcl)中使用 namespace export myproc 或在 mypackage.tcl 中使用 namespace export * 但没有成功...
有没有办法在没有全名的情况下调用我的程序?

主要有两种方式。

  1. namespace eval中使用namespace export myproc,然后在您希望使用它的上下文中使用namespace import mypackage::firstpackage::myproc
  2. 在您的使用上下文中执行 namespace path mypackage::firstpackage,以便在那里额外查找命令。 (默认情况下,所有名称空间仅在自身和全局名称空间中查找命令;namespace path 在这两者之间插入。)

不推荐namespace importnamespace path(在全局命名空间上)作为包定义的一部分;让消费代码执行此操作,因为这是拥有目标上下文的实际代码。基本上,全局命名空间是应用程序的命名空间,并且仅根据约定和历史,也是 Tcl 语言的命名空间。库代码通常不应直接对全局名称空间进行更改(少数例外情况,例如 Tk 小部件实例)。