我知道 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 语句的回答清楚地解释了大括号和括号之间的区别,但我无法弄清楚为什么空格会导致第二个块失败。
大括号是一种将多个单词组合成一个单词的引用机制。参考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
。