Oop 如何获取Tcl进程中使用的命名空间的来源

Oop 如何获取Tcl进程中使用的命名空间的来源,oop,tcl,Oop,Tcl,我有如下函数或过程贴花,如下所示,其中proc名称本身是来自其他地方的名称空间,我指的是不同的文件。我如何知道名称空间来自哪里,意味着来自哪个文件 例如: proc ::a::b {some argument} { body } 在上面显示的示例中,我想明确地知道名称空间“a”来自::a::b的来源或使用位置。它不在同一个文件中,在同一个目录中有100个其他文件 我尝试使用名称空间代码和名称空间原点,但两者都不起作用。嗯,最简单的可能是grep 如果您想在纯Tcl中实现这一点,有几个选

我有如下函数或过程贴花,如下所示,其中proc名称本身是来自其他地方的名称空间,我指的是不同的文件。我如何知道名称空间来自哪里,意味着来自哪个文件

例如:

proc ::a::b {some argument} {
    body
}
在上面显示的示例中,我想明确地知道名称空间“a”来自::a::b的来源或使用位置。它不在同一个文件中,在同一个目录中有100个其他文件


我尝试使用名称空间代码和名称空间原点,但两者都不起作用。

嗯,最简单的可能是grep

如果您想在纯Tcl中实现这一点,有几个选项:

  • 跟踪
    名称空间
    ,以便知道何时调用它。您可以使用
    info script
    获取当前执行的文件。必须在创建此命名空间之前完成
  • 用你自己的东西替换
    名称空间
    ,就像1。必须在创建命名空间之前完成
  • 如果此命名空间中有一个proc是在创建该命名空间的同一文件中创建的,则可以添加
    跟踪执行添加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,这正是我所需要的。我害怕自己使用跟踪执行,但是对于手头任务的快速周转时间来说,重载过程非常有效!再次感谢。