我有以下函数或程序decalration,如下所示,其中proc名称本身是来自其他地方的名称空间,我的意思是不同的文件。我如何知道命名空间的来源,意味着来自哪个文件?
示例:
proc ::a::b {some argument} {
body
}
在上面显示的例子中,我想明确知道命名空间的位置" a" from :: a :: b来自或使用过。它不在同一个文件中,在同一个目录中有100个其他文件。
我尝试使用命名空间代码和命名空间源,但它们都没有用。
答案 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中做,有几个选择:
namespace
,以便您知道何时调用它。您可以使用info script
获取当前执行的文件。 必须在创建此命名空间之前完成 namespace
替换为您自己的东西,其工作方式如下:必须在创建命名空间之前完成 trace execution add enterstep
并使用info frame
来获取定义此proc的文件。 可以稍后完成 答案 2 :(得分:0)
转到 Tcl Dev Kit交叉参考工具(XRef ),如果您要查找命名空间所在的文件。
XRef工具扫描Tcl源代码,然后构建一个交叉引用的数据库,显示Tcl代码组件之间的关系。这些组件包括包,文件,命名空间,命令和变量。每个Tcl组件都以树形层次结构呈现,可以展开以显示代码的定义,声明,使用和定位位置。
还有其他一些交叉引用工具。