列出Tcl文件中所有过程的方法

问题描述 投票:0回答:5

有没有办法使用另一个 tcl 文件或在同一文件中列出 myFile.tcl 中的所有过程(proc)。

tcl expect
5个回答
1
投票

您可以在获取相关文件之前和之后使用

[info procs]
并比较结果以确定添加了哪些进程。例如:

proc diff {before after} {
    set result [list]
    foreach name $before {
        set procs($name) 1
    }
    foreach name $after {
        if { ![info exists procs($name)] } {
            lappend result $name
        }
    }
    return [lsort $result]
}

set __before [info procs]
source myFile.tcl
set __after  [info procs]
puts "Added procs: [diff $__before $__after]"

我喜欢这个解决方案的一件事是,

diff
过程实际上只是一个通用的集合差分实用程序——它并不特定于比较已定义过程的列表。


1
投票

最便宜的方法是打开文件并使用

regexp
选择名称。它并不完全准确,但它做得相当不错。

set f [open "sourcefile.tcl"]
set data [read $f]
close $f

foreach {dummy procName} [regexp -all -inline -line {^[\s:]*proc (\S+)} $data] {
    puts "Found procedure $procName"
}

它处理所有情况吗?不。它涉及有用的子集吗?是的。该子集对您来说足够大吗?很有可能。


0
投票

是的,虽然不是那么容易。基本思想是在修改后的从属解释器中获取文件,该解释器仅执行一些命令:

proc proc_handler {name arguments body} {
    puts $name
}
set i [interp create -safe]
interp eval $i {proc unknown args {}}
interp alias $i proc {} proc_handler
interp invokehidden source yourfile.tcl

如果文件需要其他包(

package require
将不起作用),这种方法将失败,依赖于一些通常自动加载命令等的结果..

它也没有考虑命名空间。 (

namespace eval ::foo {proc bar a {}}
创建一个名为
::foo::bar

的过程

对于更复杂的实现,您可以查看 auto.tcl 的 auto_mkindex,它具有类似的目标。


0
投票

这是一种不同的方法:

  1. 创建临时命名空间
  2. 获取(包含)有问题的脚本,然后
  3. 使用
    info procs
    命令获取进程列表
  4. 完成后删除临时命名空间

这是我的脚本,*list_procs.tcl*:

#!/usr/bin/env tclsh

# Script to scan a Tcl script and list all the procs

proc listProcsFromFile {fileName} {
    namespace eval TempNamespace {
        source $fileName
        set procsList [info procs]
    }
    set result $::TempNamespace::procsList
    namespace delete TempNamespace
    return $result
}

set fileName [lindex $::argv 0]
set procsList [listProcsFromFile $fileName]
puts "File $fileName contains the following procs: $procsList"

例如,如果您有以下脚本,procs.tcl

proc foo {a b c} {}
proc bar {a} {}

然后运行脚本将产生:

$ tclsh list_procs.tcl procs.tcl 
File procs.tcl contains the following procs: foo bar

0
投票

不是一个答案,而是一个相关的问题,如何列出我刚刚使用“package require aPackage”所需的程序包中的程序?

© www.soinside.com 2019 - 2024. All rights reserved.