Я реализовал множество расширений TCL для конкретного инструмента в области формальных методов (расширения реализованы на C, но я не хочу, чтобы решение опиралось на этот факт).Таким образом, пользователи моего инструмента могут использовать 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 с как можно меньшим количеством расширений.