0

{*}在 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 :("
}

如您所见,我定义了 reset 变量,并且正在评估 witheval和 with {*}

虽然eval工作正常,但{*}抛出错误为

wrong # args: should be "set varName ?newValue?"
    while executing
"{*}$reset"

然后我将变量更改reset如下,

set reset {
            set count 0;
    }

即我已经删除了第二条set语句并且代码工作正常。

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

4

1 回答 1

2

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

于 2014-10-14T11:40:58.857 回答