# Tcl

Основные правила синтаксиса команд.

## ОПИСАНИЕ

Синтаксис и семантика языка Tcl определены описанным ниже образом.

Скрипт на Tcl представляет собой одну или более команд. Символы точки с запятой (;) и новой строки служат разделителями команд, если не находятся между символами кавычек. Закрывающие скобки служат окончанием тела команды при подстановках команд, если не находятся между символами кавычек.

Команда обрабатывается за два прохода. При первом проходе интерпретатор Tcl разбивает команду на слова и выполняет подстановки, как рассказано ниже. Эти подстановки выполняются одинаково для всех команд. Первое слово считается именем процедуры, которая исполняет команду. Когда процедура найдена, ей передаются остальные слова команды. Процедура может интерпретировать каждое из слов произвольным образом, например, как число, имя переменной, список или Tcl скрипт. Разные командные процедуры интерпретируют свои слова по-разному.

Слова команд разделяются пробельными символами (пробел, табуляция). Символ новой строки разделяет команды.

Если первый символ слова есть двойные кавычки ("), то слово должно заканчиваться также на двойные кавычки. Если в промежутке между знаками кавычек находятся точка с запятой, закрывающая скобка или пробельные символы (включая символ новой строки), то они будут поняты как обычные символы в составе слова. Подстановки команд, переменных и подстановки с обратным слэшем в таком слове описаны ниже. Двойные кавычки не являются частью слова.

Если слово начинается с открывающей фигурной скобки ({), то оно должно заканчиваться на парную ей закрывающую скобку (}). Внутри фигурных скобок могут также содержаться слова в фигурных скобках. При этом каждая открывающая фигурная скобка должна иметь парную ей закрывающую фигурную скобку. Однако, если открывающая или закрывающая фигурная скобка отмечена обратным слэшем, то она не учитывается при поиске парной скобки. Для символов между фигурными скобками не выполняется никаких подстановок, за исключением описанной ниже подстановки "обратный слэш - новая строка". Также не приписывается никакого специального смысла символам точки с запятой, новой строки, закрывающей скобки и пробела. Слово будет состоять из символов между скобками, за исключением самих скобок.

Если слово содержит открывающую квадратную скобку ([), то Tcl выполняет подстановку команды. Для этого он рекурсивно вызывает интерпретатор Tcl, который обрабатывает символы, следующие за скобкой, как скрипт Tcl. Скрипт может иметь любое количество команд и должен оканчиваться закрывающей квадратной скобкой (]). Результат выполнения скрипта (т.е., результат его последней команды) подставляется в слово на место скобок и всех символов между ними. В слове может быть любое количество подстановок команд. Подстановки команд не выполняются в словах, заключенных в фигурные скобки.

Если слово содержит символ доллара ($), тогда Tcl выполняет подстановку переменной: символ доллара и последующие символы заменяются в слове на значение этой переменной. Существует три способа подстановки переменной:

Здесь name - имя скалярной переменной, оно заканчивается любым символом, за исключением буквы, цифры или символа подчеркивания.

          (index)

Здесь name есть имя массива данных, а index - имя элемента внутри этого массива. name должен состоять только из букв, цифр и символов подчеркивания. Все виды подстановок выполняются по отношению к символам index.

Здесь name - имя скалярной переменной, оно может состоять из каких угодно символов, кроме закрывающей фигурной скобки. В слове может быть любое количество подстановок переменных. Подстановки переменных не выполняются для слов, заключенных в фигурные скобки.

Если в слове есть символ обратного слэша, то выполняется подстановка с обратным слэшем. Во всех случаях, кроме перечисленных ниже, обратный слэш пропускается, а следующий за ним символ обрабатывается как обычный символ и включается в состав слова. Таким способом в слово можно включать такие символы, как двойные кавычки, закрывающие скобки и символ доллара без непреднамеренной специальной обработки. Ниже перечислены последовательности символов, для которых подстановка с обратным слэшем выполняется специальным образом, и соответствующие подставляемые значения.

| Звуковой сигнал (гудок) (0х7).
| Сдвиг на одну позицию влево (0х8).
| Прогон листа (0xc).
| Новая строка, newline (0ха).
| Возврат каретки (0хd).
| Табуляция (0х9).
| Вертикальная табуляция (0xb).

\<newline>пробел

Обратный слэш, символ новой строки и все пробелы и табуляции после этого символа заменяются на одиночный пробел. Данная последовательность уникальна в том смысле, что она замещается в отдельном суб-проходе перед тем, как начинается непосредственно анализ команды. Поэтому эта последовательность будет замещена, даже если она стоит между фигурными скобками, и результирующий пробел будет интерпретироваться как разделитель слов, если только он не будет стоять между фигурными скобками или кавычками.

\ | Обратный слэш (\).
\ooo | Цифры ooo (одна, две или все три) дают восьмеричное значение символа.
\xhh | Шестнадцатеричное число hh дает шестнадцатеричное значение символа. Может присутствовать любое количество цифр.

Подстановки с обратным слэшем не выполняются в словах, заключенных в фигурные скобки, кроме подстановки "обратный слэш - новая строка".

Если символ "#" будет стоять в том месте, где Tcl предполагает первый символ первого слова команды, то этот символ и все последующие символы до следующего символа новой строки включительно истолковываются как комментарии и игнорируются. Символ комментария действителен только тогда, когда он стоит в начале команды.

При воссоздании слов команды каждый символ обрабатывается интерпретатором Tcl только один раз. Например, если выполнялась подстановка переменной, то в значении переменной никаких подстановок не производится; значение вставляется в слово без изменений. Если выполнялась подстановка команды, то вставленная команда обрабатывается целиком посредством рекурсивного вызова интерпретатора Tcl; не делается никаких подстановок перед рекурсивным вызовом и не делается никаких дополнительных подстановок в результат исполнения вставленного скрипта.

Подстановки не воздействуют на границы слов в команде. Например, при подстановке переменной все значение переменной становится частью одного слова, даже если это значение содержит пробелы.