Пока ожидает только два аргумента. Итак, ваш код должен быть:
while {$r2($r2p) == $notallowd} {incr r2p}
хотя я должен сказать, что это странная вещь, чтобы поставить while
.
Что касается вашей второй проблемы с ошибкой, сгенерированной при попытке доступа к массиву r2
, то проблема в том, что вы не использовали $ substitution для получения этого значения. Это немного другая проблема, которая возникает из-за неправильного понимания того, как переменные работают в Tcl.
Переменные Tcl на самом деле не работают так же, как переменные в других языках. Чтобы получить доступ к значению переменной, вы должны либо использовать возвращаемое значение команды set
(например, [set r2p]
), либо, в качестве ярлыка, использовать замену $, добавив символ $ перед именем вашей переменной (например, $r2p
). С другой стороны, чтобы манипулировать переменной, вы должны использовать само имя переменной без знака $ (например, r2p
).
Это не так странно, как кажется. Это работает точно так же, как работают указатели в C, только C использует символ * вместо $.
Что произошло с вашим кодом, так это то, что синтаксический анализатор expr (который используется while
, if
, for
и т. Д. Для обработки выражений) смотрит на ваш r2($r2p)
и не распознает его как доступ к переменной и поэтому пытается выполнить его как математическую функцию (например, sin()
или tan()
или round()
), которая затем завершается ошибкой, потому что нет функции r2()
.
Дополнительное объяснение:
Следует отметить, что ни for
, ни while
не являются частью синтаксиса tcl. Это просто функции / команды, которые вы вызываете. Как и в любом другом языке, то, как функция принимает свои аргументы, зависит от того, как она была написана. Поэтому, чтобы понять, как использовать while
или for
, вам действительно нужно прочитать документацию по ним вместо документации по синтаксису tcl.
Прочтите мой ответ на этот другой вопрос для более подробного объяснения того, что происходит: вычисление выражения в true в операторе if с Tcl