Oop 如何获取Tcl进程中使用的命名空间的来源
我有如下函数或过程贴花,如下所示,其中proc名称本身是来自其他地方的名称空间,我指的是不同的文件。我如何知道名称空间来自哪里,意味着来自哪个文件 例如:Oop 如何获取Tcl进程中使用的命名空间的来源,oop,tcl,Oop,Tcl,我有如下函数或过程贴花,如下所示,其中proc名称本身是来自其他地方的名称空间,我指的是不同的文件。我如何知道名称空间来自哪里,意味着来自哪个文件 例如: proc ::a::b {some argument} { body } 在上面显示的示例中,我想明确地知道名称空间“a”来自::a::b的来源或使用位置。它不在同一个文件中,在同一个目录中有100个其他文件 我尝试使用名称空间代码和名称空间原点,但两者都不起作用。嗯,最简单的可能是grep 如果您想在纯Tcl中实现这一点,有几个选
proc ::a::b {some argument} {
body
}
在上面显示的示例中,我想明确地知道名称空间“a”来自::a::b的来源或使用位置。它不在同一个文件中,在同一个目录中有100个其他文件
我尝试使用名称空间代码和名称空间原点,但两者都不起作用。嗯,最简单的可能是grep 如果您想在纯Tcl中实现这一点,有几个选项:
名称空间
,以便知道何时调用它。您可以使用info script
获取当前执行的文件。必须在创建此命名空间之前完成名称空间
,就像1。必须在创建命名空间之前完成跟踪执行添加enterstep
,并使用信息帧
获取定义此proc的文件。可以稍后再做如果要查找名称空间所在的文件,请使用Tcl开发工具包交叉引用工具(XRef。
外部参照工具扫描Tcl源代码,然后构建一个交叉引用数据库,显示Tcl代码组件之间的关系。这些组件包括包、文件、名称空间、命令和变量。每个Tcl组件都以树状层次结构表示,可以展开树状层次结构以显示代码的定义、声明、使用和位置
还有一些其他的交叉引用工具。假设您不愿意只搜索源代码(对于真实的过程名来说很容易,但在使用像
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]
}
如果将该代码放在源代码
任何其他应用程序代码之前,它将准确跟踪每个过程在全局定义位置
数组中的定义位置
将跟踪附加到跟踪
附加此监控代码的另一种方法是使用执行跟踪:
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
(老实说,跟踪让我有点害怕)更整洁,但我认为它的干扰性要小一些
但是,这一点仍然适用于仍然需要在定义相关过程之前附加跟踪的问题。谢谢Johannes,grep是一个绷带解决方案,然后我必须将其与日志连接,然后从该日志进行解析。我需要一个基于Tcl的解决方案,我认为跟踪执行是可行的,谢谢..谢谢,但是对于我的快速周转任务来说,当时拿一套装备跑是不可行的。不过这是一个好主意。谢谢Donal Fellows,这正是我所需要的。我害怕自己使用跟踪执行,但是对于手头任务的快速周转时间来说,重载过程非常有效!再次感谢。