TCL:是否有任何命令可以获取包中的包位置和过程名



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

我以前处理过一个类似的问题。要得到你的答案并没有什么魔力,只是需要大量的体力劳动。以下是我的建议:

  1. 在导入包之前,请记录名称空间和命令列表
  2. 导入相关包
  3. 重新记录名称空间和命令列表
  4. 从"before"one_answers"after"列表中,我们可以得到一个新的名称空间和命令列表
讨论

  • 我使用数组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

我不知道有什么命令能直接回答你的问题。然而,

package ifneeded <packageName> <packageVersion>

将告诉您为了拉入包而执行的命令,其中通常包括一个source命令,让您确定包源位于何处。

至于在包中定义了哪些过程,我发现这样做的最好方法是执行info procs来计算在需要包之前定义了哪些过程,然后需要包,重复info procs命令并确定添加了什么。我知道很怪,但是很管用。

最新更新