如何找到TCL程序的位置?

如何找到TCL程序的位置?,tcl,procedure,Tcl,Procedure,如何在TCL中找到过程(函数)的位置。在location下,我指的是声明它的源文件 我正在尝试阅读外国源代码,但找不到单个过程的声明,例如: set MSISDNElement [regexp -all -inline {ISDN +[0-9]+} $Command] if { $MSISDNElement != "" } { foreach elm $MSISDNElement { set MSISDNValue [list ISDN [getInternationa

如何在TCL中找到过程(函数)的位置。在location下,我指的是声明它的源文件

我正在尝试阅读外国源代码,但找不到单个过程的声明,例如:

set MSISDNElement [regexp -all -inline {ISDN +[0-9]+} $Command]

if { $MSISDNElement != "" } {
    foreach elm $MSISDNElement {
        set MSISDNValue [list ISDN [getInternationalFormat [lindex $elm 1]]]
    }
}

set EptData [list [lindex $Command 1]]

InitEptData 3
foreach Element $EptData {
    SetEptData [lindex $Element 0] [lindex $Element 1]
}

对于函数InitEptDataSetEptData,我找不到任何声明。能不能请更熟悉TCL的人解释一下如何解决我面临的问题?提前谢谢

对此没有通用的答案,因为Tcl允许您动态声明过程,因此它们可能没有实际的文件引用

对于具有定义文件的过程,有一些尝试可以改善这种情况,例如,在最近的8.5版本中,定义文件实际上作为
info frame
提供,而TIP86仅在讨论中

但是如果简单的
grep
不起作用,您可以跟踪创建过程或命令的时刻

这在不同的地方都会发生(Tcl OO可能还会添加一些,不确定):

  • 加载
    命令期间,当二进制扩展向或更现代的Tcl_CreateObjCommand注册其命令处理程序函数时
  • 加载带有proc定义的文件时,在执行
    source
    命令期间
  • 运行
    proc
    命令本身以定义新过程时
使用命令
info commands
namespace children
可以遍历整个名称空间树,以获得在执行命令之前和之后定义的命令列表。因此,您可以创建跟踪任何新命令的包装器。有关如何操作的提示,请参阅


或者,只需使用一个调试器,如RamDebugger或ActiveState商业调试器。

在bash shell中,我使用:

 find . -name "*.tcl" -exec grep -H proc_name_to_find {} \; | grep proc
这将查找所有tcl文件,然后对每个文件执行grep以搜索proc_name_to_find,然后对包含“proc”的行再次对输出进行grep

由于grep-H使用输出字符串输出文件名,因此这将显示需要在编辑器中查找定义的输出

示例

$ find . -name "*.tcl" -exec grep -H set_prime {} \; | grep proc
./my_lib.tcl:proc prime_test::set_prime {{quiet 0} {no_compare 0}} {

使用xargs还有其他解决方案…

一般来说,您无法找到过程的位置(因为Tcl为您提供了
eval
在运行时动态定义它的能力)。实际上,您可以使用文本查找(例如Linux上的
grep
)来查找某个名称的定义引用。此外,一些过程实际上是由C@Basile Starynkevitch编译的一些可执行代码定义的。是的,这里就是这种情况!谢谢一个简短的建议:当定义一个新命令时,它通常会删除旧命令(
rename
抛出一个错误)。因此,具有该名称和删除跟踪的nop proc会告诉您旧命令何时被删除。