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

Tcl 它如何解析If语句中括号内的空格,tcl,parentheses,braces,Tcl,Parentheses,Braces,我知道Tcl中的if语句需要大括号而不是圆括号 但是,以下(错误)代码打印出“啊哈!”,因为Tcl似乎能够正确解释if条件: set flow_control 1 if ($flow_control==1) { puts "Aha!" } 然而,以下(带空格)与“表达式中的不平衡开参数”(1)不符 当然,使用大括号(带括号或不带括号)、带空格或不带空格均可: set flow_control 1 if {$flow_control == 1} { puts "Braces ru

我知道Tcl中的if语句需要大括号而不是圆括号

但是,以下(错误)代码打印出“啊哈!”,因为Tcl似乎能够正确解释if条件:

set flow_control 1
if ($flow_control==1) {
    puts "Aha!"
}
然而,以下(带空格)与“表达式中的不平衡开参数”(1)不符

当然,使用大括号(带括号或不带括号)、带空格或不带空格均可:

set flow_control 1
if {$flow_control == 1} {
    puts "Braces rule!"
}
我的问题是,为什么第二个案例失败了


Donal Fellows对的回答清楚地解释了大括号和圆括号之间的区别,但我不明白为什么空格会导致第二个块失败。

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

请仔细注意命令的语法:

if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?
expr1
必须是一个单词

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

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

($flowcontrol==1)
不带空格是一个单词。展开变量,然后将
(1==1)
(一个有效表达式)指定给
if

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