使用带有多个语句的参数扩展{*}

时间:2014-10-14 05:50:54

标签: 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 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;
    }

即。我删除了第二个set语句,代码工作正常。

为什么{*}可以正常使用一个语句而不是更多?或者我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

命令lite evaluplevel(以及whileif等)可以评估脚本,即由零个或多个命令调用组成的字符串/列表。当您调用{*}$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

文档:evalifset{*}uplevelwhile