Tcl 对多个语句使用参数扩展{*}
我在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
{*}
进行参数扩展,遇到了这个问题
#!/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
语句,代码工作正常
为什么
{*}
只处理一条语句就可以了,而不处理更多的语句?或者我在这里错过了什么 命令liteeval
和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
正是正确的选择。感谢您的解释。:)