TCL:有没有命令在包中获取包位置和过程名称?

时间:2014-08-01 09:36:47

标签: tcl

是否有任何命令可以跟踪包文件位置并显示该包中定义的过程? 如果存在此功能,那么当程序员必须维护大量软件包时,这对于搜索和快速调试会有很大帮助。

2 个答案:

答案 0 :(得分:2)

我不知道任何直接回答你问题的命令。然而,

package ifneeded <packageName> <packageVersion>

将告诉您为了拉入包而执行的命令,这些命令通常包含一个source命令,可以让您找出包源所在的位置。

至于确定哪个procs是在一个包中定义的,我发现这样做的最好方法是在需要包之前做info procs来计算你定义的proc,需要包,重复info procs命令并确定添加了什么。 Klunky,我知道,但它确实有效。

答案 1 :(得分:2)

我以前处理过类似的问题。得到你的答案毫无魔力,只有很多肘部油脂。这是我的建议:

  1. 导入包之前,请记录名称空间和命令列表
  2. 导入有问题的包
  3. 再次记录名称空间和命令列表
  4. 从“之前”和“之后”列表中,我们可以推导出新名称空间和命令的列表
  5. 讨论

    • 我正在使用数组stat来简化调试:在开发代码期间,我只能parray stat进行调试
    • 诸如csv之类的软件包巧妙地将新命令放在同名的名称空间中:::csv,而其他诸如Tcx的东西则放在全局名称空间中。我们需要解决这两种情况

    注意事项

    • 包可能会导入其他包,这会导致计数(名称空间和命令)
    • 我不知道info commandsinfo procs之间的区别。我总是使用前者
    • 过程packageStatistics需要有效的包名称。给它一个无效的名称,将发生意外行为

    守则

    package require struct::set 
    
    proc packageStatistics {packageName} {
        # Record "before" statistics
        set stat(ns,before) [namespace children]
        set stat(cmd,before) [info commands]
    
        # Now, import the package in question
        set stat(version) [package require $packageName]
    
        # Record "after" statistics
        set stat(location) [package ifneeded $packageName $stat(version)]
        set stat(ns,after) [namespace children]
        set stat(cmd,after) [info commands]
    
        # Report package name, version and location
        puts "Package: $packageName version $stat(version)"
        puts "Location:"
        puts "$stat(location)"
    
        # Show a list of extra commands in the global namespace
        puts "Commands:"
        set stat(cmd,new) [lsort [struct::set difference $stat(cmd,after) $stat(cmd,before)]]
        foreach cmd $stat(cmd,new) {
            puts "- $cmd"
        }
    
        # Show a list of extra commands in each of the extra namespace
        set stat(ns,new) [lsort [struct::set difference $stat(ns,after) $stat(ns,before)]]
        foreach ns $stat(ns,new) {
            foreach cmd [info commands ${ns}::*] {
                puts "- $cmd"
            }
        }
    }
    
    packageStatistics csv
    

    输出

    Package: csv version 0.7.2
    Location:
    source /System/Library/Tcl/tcllib1.12/csv/csv.tcl
    Commands:
    - ::csv::writematrix
    - ::csv::split
    - ::csv::Split
    - ::csv::writequeue
    - ::csv::join
    - ::csv::read2matrix
    - ::csv::read2queue
    - ::csv::split2matrix
    - ::csv::Split2matrix
    - ::csv::split2queue
    - ::csv::joinlist
    - ::csv::report
    - ::csv::joinmatrix
    - ::csv::iscomplete