来自proc名称的TCL包名称

时间:2013-08-31 15:50:11

标签: tcl

我正在尝试计算proc所属的包,以便我可以验证包版本

说我有包

some::package 1.0

哪个有proc

some::package::some_proc

给出一些:: package :: some_proc我希望能够获得1.0

我无法保证名称空间与其所属的包名称相同

任何帮助非常感谢

3 个答案:

答案 0 :(得分:2)

从技术上讲,如果不提供自己的package require版本,就无法做到这一点。 Tcl中的命名空间和包和文件没有链接,就像它们是Python或Java一样。

如果您知道所有过程都是静态定义的(例如没有动态代码生成),您可以用您自己的版本替换package require并在调用之前和之后枚举所有过程并将名称放在某个注册表中。< / p>

你想要验证什么?

如果要验证某种API,可以查看Tcllib中的pluginmgr包。

答案 1 :(得分:0)

您正在寻找namespace current:

% namespace eval some::package {
    proc some_proc {} { puts [namespace current] }
}
% some::package::some_proc
::some::package

答案 2 :(得分:0)

按照惯例,不是普遍的,您可以从包含相关命令的命名空间名称中获取包的名称:

set pkg [namespace qualifiers [namespace which $theCommand]]
# Be aware, this produces the empty string for global commands

然而,并非所有包都这样做;一些较旧的包不会将其公共命令放入命名空间(出于历史/反向兼容性原因)。在这种情况下,搜索文档是你唯一能做的事情。

获得软件包名称后,您可以使用package present确定当前加载的软件包版本:

set version [package present $pkg]

这仅适用于包装先前为package require d的情况。您还可以使用package versions确定您的环境中可用的其他版本的软件包;虽然Tcl只会将一个版本的软件包加载到解释器上下文中,但您可以安装许多不同版本而不必(必然)出现问题。