如何找到TCL程序的位置?
如何在TCL中找到过程(函数)的位置。在location下,我指的是声明它的源文件 我正在尝试阅读外国源代码,但找不到单个过程的声明,例如:如何找到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
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的人解释一下如何解决我面临的问题?提前谢谢 对此没有通用的答案,因为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会告诉您旧命令何时被删除。