我正在尝试编写一个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}]
我的动机是我正在尝试为个别陈述编写自己的时间/分析器。
答案 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所述,如果您的代码涉及访问上一级命令,变量,那么您必须根据需要使用uplevel
或upvar
。