Tcl 在调用方上下文中打印包含列表变量的表达式
我试图在TCL中实现一个命令记录器,其中每个命令都用打印文件包装,并在调用方上下文中执行 该方法还应该通过在正确的位置添加Tcl 在调用方上下文中打印包含列表变量的表达式,tcl,Tcl,我试图在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
关键字来扩展引用列表或列表列表列表的变量
例如:
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
您自己重新实现这一点是可行的,但很繁琐(例如,在预处理截获命令的参数时,您需要确保不会通过先发制人的命令评估产生副作用)。Once
set x[list“p”Q“R”]
已执行,您只剩下pqr
作为$x
的内容。我认为没有任何方法返回[列表pqr]
。感谢您的回复@mrcalvin。是的,目标是生成一个可执行的代码片段用于重播。不幸的是,我无法使用跟踪
包,因为我一直在使用Tcl8.5(工具链问题)。即使有某种方法可以用{}括起列表
我可以对日志进行后期处理并使其可执行。我现在遇到的问题是,我用一个简单的puts
命令看不到列表边界。跟踪
包?可以使用跟踪
命令。哦,对不起,你是对的。它可以工作。非常感谢你的帮助!