Как он анализирует пробелы в скобках в операторе If
Я понимаю, что оператор if в Tcl требует скобок { }
вместо скобок ( )
,
Однако следующий (ошибочный) код печатает "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 на оператор if в TCL четко объясняет разницу между фигурными скобками и скобками, но я не могу понять, почему из-за пробелов второй блок выходит из строя.
1 ответ
Скобки - это механизм цитирования, который группирует несколько слов в одно слово. Обратитесь к 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
,