我已经在形式化方法的领域中实现了许多TCL扩展(扩展在C中实现,但我不希望解决方案依赖于这个事实)。因此,我的工具的用户可以使用TCL进行原型算法。它们中的很多只是命令的线性列表(它们是强大的),例如:TCL中的扩展TCL解释器
my_read_file f
my_do_something a b c
my_do_something_else a b c
现在,我对计时感兴趣。这是可能改剧本获得:
puts [time [my_read_file f] 1]
puts [time [my_do_something a b c] 1]
puts [time [my_do_something_else a b c] 1]
取而代之的是我想定义程序xsource执行Tcl脚本和获取/写时序为我所有的命令。某种类型的分析器。主要思想如下:
set f [open [lindex $argv 0] r]
set inputLine ""
while {[gets $f line] >= 0} {
set d [expr [string length $line] - 1]
if { $d >= 0 } {
if { [string index $line 0] != "#" } {
if {[string index $line $d] == "\\"} {
set inputLine "$inputLine [string trimright [string range $line 0 [expr $d - 1]]]"
} else {
set inputLine "$inputLine $line"
set inputLine [string trimleft $inputLine]
puts $inputLine
puts [time {eval $inputLine} 1]
}
set inputLine ""
}
}
}
它适用于命令的线性列表,甚至允许在多行上使用注释和命令。但是,如果用户使用if语句,循环和过程定义,则会失败。你能提出一个更好的方法吗?它必须是纯粹的TCL脚本,尽可能少的扩展。
这对我很有用,它非常优雅。这里唯一的缺点是报告不能局限于命令的子集(如果这很重要,那么GrAnd的解决方案就必须考虑)。 – meolic
@meolic:您可以随时应用后期处理步骤。例如,将所有的日志信息转储到一个文件,然后只是grep的有趣的位。 –
@DonalFellows关于抑制优化的最后一个注释,是否至少比较结果安全?即如果我有一个脚本并将其重构为另一个脚本,比较两者之间的时间安全性还是可能的,还是有可能优化反转结果? –