如何找到TCL程序的位置?

时间:2012-09-29 09:28:37

标签: tcl procedure

如何在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]
}

功能 InitEptData & SetEptData 我找不到任何声明。有人可以更深入地了解TCL,解释如何解决我所面临的问题吗?提前谢谢!

2 个答案:

答案 0 :(得分:9)

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

有一些尝试可以改善具有定义文件的过滤器的情况,例如TIP280,在最近的8.5版本中实际可用作info frame,而TIP 86仅在讨论

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

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

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

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

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

答案 1 :(得分:0)

从bash shell中,我使用:

 find . -name "*.tcl" -exec grep -H proc_name_to_find {} \; | grep proc

这会找到所有tcl文件,然后在每个文件上执行grep以搜索proc_name_to_find,然后对于那些包含' proc'

的行再次greped输出

由于 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还有其他解决方案......