TCL命令包装

时间:2015-07-09 03:32:44

标签: 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 void [wrapper {set var $tmp}]

我的动机是我正在尝试为个别陈述编写自己的时间/分析器。

2 个答案:

答案 0 :(得分:3)

使用

而不是“EXECUTE COMMAND”
uplevel 1 $command

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

文档:uplevel

答案 1 :(得分:2)

如果您的唯一目的是让一组代码执行所需的时间,那么您可以尝试使用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:

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

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中的工作方式一样。

正如Mr.Peter所述,如果您的代码涉及访问上一级命令,变量,那么您必须根据需要使用uplevelupvar

参考: timerename