Ответ 1
Скобки, {}
и круглые скобки, ()
, не являются взаимозаменяемыми в Tcl.
Формально фигурные скобки (с одно исключение) вид цитирования, который указывает, что дальнейшие подстановки не должны выполняться над содержимым. В первом случае выше это означает, что этот аргумент доставляется if
без подстановки, который оценивает его как выражение. Субязык выражения имеет сильно аналогичную схему интерпретации фигурных скобок для общего Tcl; они обозначают буквальное значение без дальнейших замещений для выполнения на нем.
В отличие от этого, скобки в основном не являются специальными в Tcl. Исключения составляют имена элементов массивов (например, $foo(bar)
) в выражении sublanguage (который использует их для группировки, как в математических выражениях по всему программированию) и в подъязыке регулярного выражения (где они являются другим типом группировки и несколько других вещей). Полностью законно использовать круглые скобки - сбалансированные или иначе - как часть имени команды в Tcl, но у вас могут быть ваши коллеги-программисты, которые жалуются на вас, чтобы писать путающий код.
Особенности
В этом конкретном случае тестовое выражение этого if
:
if {{$number == 1 && $name == "hello"} || {$number == 0&&$name == "yes"}} {...}
анализируется на:
blah#1 LOGICAL_OR blah#2
где каждый blah
является литералом. К сожалению, blah#1
(который в точности равен $number == 1 && $name == "hello"
) не имеет логической интерпретации. (Не делает blah#2
, но мы никогда не удосуживаемся считать это.) Вещи, безусловно, здесь очень не так!
Самое простое исправление заключается в том, чтобы сменить эти фиктивные фигурные скобки на скобки:
if {($number == 1 && $name == "hello") || ($number == 0&&$name == "yes")} {...}
Готов поспорить, это то, что вы изначально хотели.
Предупреждение: расширенная тема
Однако другое исправление заключается в добавлении немного дополнительного:
if {[expr {$number == 1 && $name == "hello"}] || [expr {$number == 0&&$name == "yes"}]} {...}
Это, как правило, не очень хорошая идея - лишний объем без дополнительной выгоды - но имеет смысл, когда вы пытаетесь использовать динамически сгенерированное выражение в качестве условия теста. Не делайте этого, если вы действительно не уверены, что вам нужно это сделать! Я серьезно. Это очень продвинутый метод, который вам вряд ли когда-либо понадобится, и часто есть лучший способ сделать вашу общую цель. Если вы думаете, что вам это может понадобиться, ради того, чтобы спросить здесь, как это сделать, и мы постараемся найти лучший способ; там почти всегда доступно.