Как он анализирует пробелы в скобках в операторе 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,

Другие вопросы по тегам