Tcl 无全名调用过程

Tcl 无全名调用过程,tcl,Tcl,我写了两个包: 第一包: # firstpackage.tcl namespace eval mypackage::firstpackage {} proc mypackage::firstpackage::myproc {} { # ... } package provide mypackage::firstpackage 1.0 # secondpackage.tcl namespace eval mypackage::secondpackage {} proc mypackage

我写了两个包:
第一包:

# 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
第二套:

# 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
我同时调用这两个包,如下所示:

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

package provide mypackage 1.0
package require mypackage
# set myvar [mypackage::firstpackage::myproc] works...
set myvar [firstpackage::myproc]
现在,当我调用
mypackage 1.0
时,我不想这样调用我的过程的全名:

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

package provide mypackage 1.0
package require mypackage
# set myvar [mypackage::firstpackage::myproc] works...
set myvar [firstpackage::myproc]
我认为这是可能的。。。但我有一个错误:无效的命令名“firstpackage::myproc”
我尝试在我的两个文件(firstpackage.tcl和secondpackage.tcl)中使用
名称空间导出myproc
,或在mypackage.tcl中使用
名称空间导出*
,但没有成功…

有没有办法不用全名调用我的过程?

有两种主要方法

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

  • 不建议将
    名称空间导入
    名称空间路径
    (在全局名称空间上)作为包定义的一部分;让消费代码这样做,因为这是拥有目标上下文的实际代码。基本上,全局名称空间是应用程序的名称空间,根据惯例和历史,也是Tcl语言的名称空间。库代码通常不应直接更改全局名称空间(只有少数例外,如Tk小部件实例)。

    它与
    名称空间路径mypackage
    一起工作,但与
    名称空间路径mypackage::firstpackage
    不一起工作。您知道吗?在我的上下文中,
    名称空间eval
    +
    名称空间import mypackage::firstpackage::myproc
    中的
    名称空间导出myproc
    不起作用。另一个想法?@Mkn
    名称空间路径
    是名称空间的单一列表;如果您使用它两次(对于特定名称空间),那么它将替换。