如何获取Tcl Proc中使用的命名空间的起源

时间:2013-08-01 22:21:20

标签: oop tcl

我有以下函数或程序decalration,如下所示,其中proc名称本身是来自其他地方的名称空间,我的意思是不同的文件。我如何知道命名空间的来源,意味着来自哪个文件?

示例:

proc ::a::b {some argument} {
    body
}

在上面显示的例子中,我想明确知道命名空间的位置" a" from :: a :: b来自或使用过。它不在同一个文件中,在同一个目录中有100个其他文件。

我尝试使用命名空间代码和命名空间源,但它们都没有用。

3 个答案:

答案 0 :(得分:2)

假设您不愿意只搜索源代码(使用真实的过程名称很容易,但在使用b之类的简短示例时则不那么多!)您可以建立有关事物的位置的信息通过检测proc做什么来定义。这一切都有效,因为proc 只是一个普通的命令

重载proc以添加跟踪

这样做的经典方法是重命名proc并在其位置放置一个跟踪命令(一个过程),一旦完成就委托给原始重命名的proc

rename proc _real_proc
_real_proc proc {name arguments body} {
    global definitionLocations
    if {![string match "::*" $name]} {
        set name ::[string trimleft [uplevel 1 {namespace current}]::$name ":"]
    }
    set definitionLocations($name) [file normalize [info script]]
    uplevel 1 [list _real_proc $name $arguments $body]
}

如果您将该代码放在source任何其他应用程序代码之前,它将跟踪全局definitionLocations数组中每个过程的确切位置。

使用跟踪附加跟踪

附加此监视代码的另一种方法是使用执行跟踪:

trace add execution proc enter {apply {{arguments op} {
    global definitionLocations
    set name [lindex $arguments 1]
    if {![string match "::*" $name]} {
        set name ::[string trimleft [uplevel 1 {namespace current}]::$name ":"]
    }
    set definitionLocations($name) [file normalize [info script]]
}}}

我不确定这是否比最重要的proc更合适(痕迹让我有点害怕,说实话)但是我觉得它有点不那么干扰......

然而,关于在定义相关程序之前仍然需要附加跟踪的要点仍然适用。

答案 1 :(得分:0)

嗯,最简单的可能是grep。

如果你想在纯Tcl中做,有几个选择:

  1. 跟踪namespace,以便您知道何时调用它。您可以使用info script获取当前执行的文件。 必须在创建此命名空间之前完成
  2. namespace替换为您自己的东西,其工作方式如下:必须在创建命名空间之前完成
  3. 如果此命名空间中的proc是在创建命名空间的同一文件中创建的,则可以添加trace execution add enterstep并使用info frame来获取定义此proc的文件。 可以稍后完成

答案 2 :(得分:0)

转到 Tcl Dev Kit交叉参考工具(XRef ),如果您要查找命名空间所在的文件。
 XRef工具扫描Tcl源代码,然后构建一个交叉引用的数据库,显示Tcl代码组件之间的关系。这些组件包括包,文件,命名空间,命令和变量。每个Tcl组件都以树形层次结构呈现,可以展开以显示代码的定义,声明,使用和定位位置。

还有其他一些交叉引用工具。