Tcl 对多个语句使用参数扩展{*}

Tcl 对多个语句使用参数扩展{*},tcl,eval,variable-expansion,Tcl,Eval,Variable Expansion,我在tcl中使用{*}进行参数扩展,遇到了这个问题 #!/usr/bin/tclsh set reset { set count 0; set age 24; } puts $reset eval $reset; # This is working fine. Commented out the below line and tried {*}$reset; # This is throwing error. Commented out the above

我在tcl中使用
{*}
进行参数扩展,遇到了这个问题

#!/usr/bin/tclsh

set reset {
        set count 0;
        set age 24;
}

puts $reset

eval $reset; # This is working fine. Commented out the below line and tried

{*}$reset; # This is throwing error. Commented out the above line and tried.

if { [ info exists count ] && [ info exists age ] } {
        puts "count & age initialzed to  $count and $age"
} else {
        puts "count & age not initialzed :("
}
如您所见,我已经定义了重置变量,并且正在使用
eval
以及
{*}
进行计算

eval
工作正常时,
{*}
抛出错误

wrong # args: should be "set varName ?newValue?"
    while executing
"{*}$reset"
然后我将变量
reset
更改如下:

set reset {
            set count 0;
    }
i、 e.我已经删除了第二个
set
语句,代码工作正常


为什么
{*}
只处理一条语句就可以了,而不处理更多的语句?或者我在这里错过了什么

命令lite
eval
uplevel
(和
while
if
等)可以评估脚本,即由零个或多个命令调用组成的字符串/列表。当您调用
{*}$reset
时,您会得到六个单词,而不是一个,但是解释器仍然希望调用一个命令。实际调用的是带有五个参数的命令
set
,该命令将对此犹豫不决

将一个单词扩展为多个单词可以正常工作,只要扩展正好形成一个命令调用:

set foo bar
# => bar
字数太少:

set cmd set
# => set
{*}$cmd
# => wrong # args: should be "set varName ?newValue?"
太多的话:

set cmd {set foo baz ; set abc def}
# => set foo baz ; set abc def
{*}$cmd
# => wrong # args: should be "set varName ?newValue?"
恰到好处:

set cmd {set foo}
# => set foo
{*}$cmd
# => bar
set cmd {set foo baz}
# => set foo baz
{*}$cmd
# => baz
set cmd set
# => set
{*}$cmd ghi jkl
# => jkl
set cmd {set mno}
# => set mno
{*}$cmd pqr
# => pqr
也恰到好处:

set cmd {set foo}
# => set foo
{*}$cmd
# => bar
set cmd {set foo baz}
# => set foo baz
{*}$cmd
# => baz
set cmd set
# => set
{*}$cmd ghi jkl
# => jkl
set cmd {set mno}
# => set mno
{*}$cmd pqr
# => pqr

文档:,,,

Erm,即使使用单个命令,它本身也不会“工作”,因为
$count
将具有值
0
而不是
0
,这实际上解释了问题:
被解释为字符串,而不是代码的元字符。是。杰瑞。你是对的。现在只有我在观察这一点。那么在一个实例中,可以单独使用一个命令吗?我不建议这样使用参数扩展,因为我认为这不是实现
{*}
的原因。若要计算代码,请使用
eval
,若要展开列表,请使用
{*}
。有两行代码,就好像您在计算
设置计数“0”;设置年龄“24;”
。因为
重置
确实包含脚本,
eval
正是正确的选择。感谢您的解释。:)