1

我知道 Tcl 中的 if 语句需要大括号{ }而不是括号( )

"Aha!"但是,由于 Tcl 似乎能够正确解释 if 条件,因此会打印以下(错误的)代码:

set flow_control 1
if ($flow_control==1) {
    puts "Aha!"
}

然而,以下(带空格)因表达式“(1”中的不平衡开放括号)而失败

set flow_control 1
if ($flow_control == 1) {
    puts "Aha!"
}

当然,使用带或不带括号、带或不带空格的大括号都可以:

set flow_control 1
if {$flow_control == 1} {
    puts "Braces rule!"
}

我的问题是,为什么第二种情况会失败?

Donal Fellows 对TCL 中的 if 语句的回答清楚地解释了大括号和括号之间的区别,但我无法弄清楚为什么空格会导致第二个块失败。

4

1 回答 1

3

大括号是一种引用机制,可以将多个单词组合成一个单词。参考12条语法规则

仔细注意if命令的语法:

if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?

expr1必须是一个单词。

{ $foo == $bar }由于大括号,是一个单词

($flowcontrol == 1)没有大括号或双引号,因此它被解析为 3 个单独的单词。第一个单词的变量被扩展,然后这个单词被赋予if,expr1并且(1不是一个有效的表达式。

($flowcontrol==1)没有空格是一个单词。变量被展开,然后(1==1)——一个有效的表达式——被赋予if.

于 2015-01-30T02:03:24.657 回答