MSW уже дали вам правильный ответ, но я думаю, что нужно немного больше объяснений, чтобы прояснить некоторые другие недоразумения, которые у вас возникают, основываясь на ваших комментариях.
Сначала я объясню вещи с использованием non-tclтерминология, так как я думаю, что это менее запутанно таким образом.
В tcl, if
не является утверждением.if
- это функция.По этой причине открывающая фигурная скобка должна находиться на одной строке: новая строка завершает список аргументов функции.Например, в следующем коде:
a b c d
e f
интерпретатор Tcl увидит два вызова функций.Первый для работы a
с аргументами b, c и d, а второй для работы e
с одним аргументом f.Аналогично, в следующем:
if a
b
Tcl видит вызов функции if
с одним аргументом.Поскольку if
ожидает по крайней мере два аргумента, он (не сам интерпретатор) выдает ошибку, сообщающую о неправильном количестве аргументов.
Это также объясняет, почему должен быть пробел между if и его первым аргументом.Это просто потому, что в tcl имена переменных и функций буквально могут содержать практически все, включая пробелы, запятые и непечатные символы, такие как NUL.Например, вы можете определить функцию с именем a{b}
:
proc a{b} {} {puts HA!}
a{b} ;# <-- prints out HA!
Так что если вы сделаете что-то вроде:
if{x} {y}
tcl будет жаловаться, что функция if{x}
не определена.
if
- не единственное, что работает так.Tcl на самом деле не имеет ключевых слов, просто стандартная библиотека встроенных функций, таких как for
, foreach
и while
.Для всех них применяются одинаковые правила.
не очень важно:
С другой стороны, функция if
в tcl работает как троичный операторв C: возвращает значение.На самом деле вы можете сделать следующее:
# It is unfortunate that this "give" function is not built in.
# We use it to return something from if without actually
# calling return:
proc give {x} {return $x}
set something [if {$x} {give "Very true indeed."} {give "Unfortunately false."}]