在调用者上下文中打印包含列表变量的表达式

Print expression containing list variables in caller context

我正在尝试在 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]]

The method should also expand variables that refer to lists or list of lists by adding the list keyword in the right places.

什么是 objective,生成可执行片段以重播记录的命令执行?在任何情况下,使用 [list] 命令形式将变量的值序列化为一个列表对于您的记录器来说并不是特别有意义。此外,这在 Tcl 中是不可能的,在执行 [list] 之后,无论其诞生形式如何,它都是一个列表(Tcl 值可以通过多种方式成为列表)。这是一个迷失形式的演员表...

I'm trying to implement a command logger in TCL

您是否考虑过一些内置机制来设定您的期望和/或将您的实施建立在其之上? Execution traces 将从记录器的角度向您展示您的期望:

% 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

自己重新实现,可行,但乏味(例如,在预处理拦截命令的参数时,您需要确保不会通过先发制人的命令评估产生副作用)。