如何找到TCL程序的位置?

nen*_*ito 8 procedure tcl

如何在TCL中找到程序(功能)的位置.在位置下我指的是声明它的源文件.

我正在尝试读取外部源代码,但无法找到单个过程的声明,例如:

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]
}
Run Code Online (Sandbox Code Playgroud)

对于InitEptDataSetEptData函数,我找不到任何声明.有人可以更深入地了解TCL,解释如何解决我所面临的问题吗?提前致谢!

sch*_*enk 9

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

有一些尝试可以改善具有定义文件的过程的情况,例如TIP280,它实际上可info frame用于最近的8.5版本,以及TIP 86,仅在讨论中.

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

这种情况发生在各个地方(Tcl OO可能会添加更多,不确定):

  • load命令期间,二进制扩展使用Tcl_CreateCommand或更现代的Tcl_CreateObjCommand 注册其命令处理函数.
  • source加载proc定义的文件的命令期间
  • 在运行proc命令本身时定义新过程

使用这些命令info commands,namespace children您可以遍历整个命名空间树,以获取执行命令之前和之后定义的命令列表.因此,您可以创建一个跟踪任何新命令的包装器.有关如何操作的一些提示,请参见http://wiki.tcl.tk/1489.

或者,只需使用像RamDebugger http://www.compassis.com/ramdebugger/Intro或ActiveStates商业调试器这样的调试器.