Самый простой способ сделать это:
proc myeval { args } {
info_msg "Executing Tcl command: $args"
set catch_res [catch $args res]
if { $catch_res != 0 } {
error_msg "Failed in command: $args"
error_msg "$res"
}
return $res
}
Здесь мы заменили catch {eval exec $args} res
на catch $args res
(плюс некоторые косметические вещи), что приведет к оценке аргументов как скрипта без дальнейшей замены .Вы бы использовали это так:
myeval foo bar $boo
В качестве альтернативы, если вы после выполнения подстановок и в catch
, вам лучше написать эту более сложную версию:
proc myeval { script } {
info_msg "Executing Tcl command: [string trim $script]"
set catch_res [catch [list uplevel 1 $script] res]
if { $catch_res != 0 } {
error_msg "Failed in command: [string trim $script]"
error_msg "$res"
}
return $res
}
В этом случае вы бы назвали это так:
myeval {
foo bar $boo
}