它如何在If语句中解析括号内的空格

时间:2015-01-30 01:51:47

标签: tcl parentheses braces

我理解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'回答the if statement in TCL清楚地解释了括号和括号之间的区别,但我无法弄清楚为什么空格会导致第二个块失败。

1 个答案:

答案 0 :(得分:3)

大括号是一种引用机制,可将多个单词组合成一个单词。请参阅12 syntax rules

请注意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