2015-01-30 1 views
1

Я понимаю, что оператор if в Tcl требует скобок { } вместо круглых скобок ().Как он анализирует пробел в круглых скобках в операторе If

Однако следующий (ошибочный) код печатает "Aha!" потому Tcl, кажется, чтобы иметь возможность интерпретировать, если условие правильно:

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

Однако следующий (с пробелами) терпит неудачу с «несбалансированной открытой Paren в выражении" (1" »

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

И, конечно же, с помощью фигурных скобок либо с или без скобок, с пробелами или без работы:

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

Мой вопрос: почему второй случай терпит неудачу?

Ответ удаленных участников на the if statement in TCL ясно объясняет разницу между скобками и скобками, но я не могу понять, почему пробелы приводят к сбою второго блока.

ответ

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.

+0

Благодарим вас за очень четкое объяснение. – bagelfire