TCL命令包装

TCL命令包装,tcl,Tcl,我正在尝试编写一个TCL过程,它允许我包装语句,然后在内部“执行”它们 例如,如果我最初有: set var $tmp 我想做一些程序: proc wrapper {command} { puts "do something here" puts $command #ie below : write "set var $tmp" to stdout EXECUTE COMMAND HERE puts "do something else here" } set voi

我正在尝试编写一个TCL过程,它允许我包装语句,然后在内部“执行”它们

例如,如果我最初有:

set var $tmp
我想做一些程序:

proc wrapper {command} {
   puts "do something here"
   puts $command #ie below : write "set var $tmp" to stdout
   EXECUTE COMMAND HERE
   puts "do something else here"
}

set void [wrapper {set var $tmp}]

我的动机是,我正试图为个人陈述编写自己的计时/剖析器

如果您的唯一目的是获取一组代码执行所需的时间,则可以尝试使用
time
命令,该命令已在
Tcl
中提供

时间脚本?计数

此命令将调用
Tcl
解释器
count
次来评估脚本(如果未指定
count
,则调用一次)。然后它将返回表单的字符串

503.2 microseconds per iteration
它指示每次迭代所需的平均时间量,以微秒为单位。时间是用经过的时间来度量的,而不是CPU时间

示例:

set code_block {
    foreach x "1 2 3" {
        set y [expr {$x*20}];
    }
}

puts [time $code_block 10]; # Executing the code for 10 times
这可能会产生随机输出,例如

11.9 microseconds per iteration
更新1:

如果您希望打印命令以及执行,这也是可能的。您可以使用
rename
命令覆盖
time
命令

rename time _time; # Changing the 'time' to '_time'
# Defining your own 'time' command
proc time {command {count 1}} {
    # Printing the commands here
    puts $command
    # Calling the actual '_time' command
    # and returning that value from here
    return [_time $command $count]
}
将上述代码放在代码顶部,然后使用
time
命令,这将仅使用我们的自定义过程

它们作为命令集传递,而命令集又是字符串。但是,在对代码求值时,它的行为就像它在
tclsh
中的工作方式一样

正如Peter先生所回答的,如果您的代码涉及访问以前级别的命令、变量,那么您必须根据需要使用
uplevel
upvar

参考:

使用

请注意,如果您尝试使用
包装器
之类的命令对脚本计时,它将不会被字节编译,这意味着它不会像在过程中那样执行


文档:

我对包装函数并在其中执行语句的通用解决方案更感兴趣。不过,这是一个解决激发它的特定问题的方法。如果可能的话,我不仅希望“在这里执行命令”,还希望打印出命令。我是tcl的新手,但后者至少看起来是可行的。我将命令作为字符串传递(我想是吧?)。执行它似乎是另一个问题。这很好。如果我不想直接使用/重命名time,这个答案给了我足够的精力来编写自己的包装器,以便打印代码块并执行它。所以在更新1中,puts$command将打印代码块?您也可以使用执行跟踪来跟踪命令的执行时间,但它们有很多开销(因为它们禁止字节码编译)。
uplevel 1 $command