我正在尝试在TCL中实现一个命令记录器,其中每个命令都被打印包在调用者上下文中执行。
该方法还应该通过在正确的位置添加list关键字来扩展引用列表或列表的变量。
例如:
proc exec_cmd {cmd} {
uplevel puts \"$cmd\"
uplevel $cmd
}
proc somefunc {inlist1 inlist2} {
...
}
set x [list "P" "Q" "R"]
set y [list [list "A" "B"] [list "X" "Y"]]
exec_cmd {somefunc $x $y}在上面的示例中,我希望记录器打印[list P Q R]和[list [list A B] [list [X Y]],而不是$x和$y。
我该怎么做?
到目前为止,这是我尝试过的,但这并不像我想要的那样有效:
proc exec_cmd {cmd} {
set stripped [string map {\" {} [ \[ ] \]} $cmd]
uplevel puts \"$stripped\"
uplevel $cmd
}对于上面的例子,我得到的输出是:
somefunc P Q R {A B} {X Y}但我想要的是
somefunc [list P Q R] [list [list A B] [list X Y]]发布于 2019-11-07 20:41:29
该方法还应该通过在正确的位置添加list关键字来展开引用列表或列表列表的变量。
目标是什么,产生一个可执行片段来重放记录的命令执行?在任何情况下,使用list命令表单序列化变量的值被认为是一个列表,对于您的记录器来说并不特别有意义。此外,这在Tcl中是不可能的,在列表执行之后,它是一个列表,不管它的诞生形式( Tcl值如何成为列表有很多种方法)。这是一个迷失的演员.
我正在尝试在TCL中实现一个命令记录器
您是否考虑过一些内置机制来设置您的期望和/或将您的实现建立在基础之上?执行跟踪将向您展示您可以从记录器的角度来预期什么:
% proc report args {puts [info level 0]}
% trace add execution somefunc enter report
% somefunc $x $y
report {somefunc {P Q R} {{A B} {X Y}}} enter重新实现这一点你自己,可行,但繁琐(例如,你需要确保你不产生副作用,通过先发制人的命令评估时,预处理一个被截获的命令的参数)。
https://stackoverflow.com/questions/58755960
复制相似问题