我正在尝试在 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]]
该方法还应该通过在正确的位置添加 list 关键字来扩展引用列表或列表列表的变量。
目标是什么,生成一个可执行片段来重放记录的命令执行?在任何情况下,使用 [list] 命令形式序列化变量的值对于您的记录器来说都没有特别意义。此外,这在 Tcl 中是不可能的,在 [list] 执行之后,无论其出生形式如何,它都是一个列表(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
自己重新实现它,可行但乏味(例如,在预处理截获的命令的参数时,您需要确保不会通过抢占命令评估产生副作用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句