Основные понятия и элементы


Основы синтаксиса команд

        Синтаксически язык Tcl похож одновременно на оболочки Unix и lisp. Тем не менее, интерпретация команд в Tcl отличается от обеих систем. Команда Tcl состоит из одной или нескольких команд, разделенных символами новой строки или точками с запятой. Каждая команда состоит из набора полей, разделенных пустым промежутком (пробелами или табуляцией). Первое поле должно быть именем команды, а необязательные остальные поля — суть аргументы, передаваемые этой команде. Например, команда:

        set a 22

имеет три поля: первое, set, есть имя команды, а остальные два, а и 22, будут переданы в качестве аргументов команде set. Имя команды должно быть именем встроенной команды Tcl, дополнительной команды, созданной для данного приложения процедурой Tcl_CreateCommand, или командной процедурой, определенной, с помощью встроенной команды рrос.

        Аргументы передаются текстовыми строками в буквальном смысле. Команды пользуются этими строками так, как им требуется. Например, команда set считает свой первый аргумент именем переменной, а второй — строковым значением для присвоения этой переменной. Другие команды могут считать свои аргументы целыми числами, списками, именами файлов или командами Tcl.

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

        Комментарии

        При изображении первого символа команды, кроме пробела, в виде #, все последующие символы в этой строке до символа новой строки включительно считаются комментарием и игнорируются. Когда комментарии встроены во вложенных командах (например, поля, заключенные в фигурные скобки), они должны иметь парные фигурные скобки. Это необходимо потому, что когда Tcl анализирует команду верхнего уровня, он еше не знает, что вложенное поле будет использовано как команда, и поэтому не может обработать вложенный символ комментария как символ комментария.

        Группирование аргументов с помощью двойных кавычек

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

        set a "This is a single argument"

передаст команде set два аргумента: а и This is a single argument. Выполнение подстановок команд, подстановок переменных и подстановок с обратным слешем внутри двойных кавычек будет сохранено. Если первый символ в поле команды не двойные кавычки, тогда при анализе этого поля двойные кавычки не имеют специальной интерпретации.

        Группирование аргументов с помощью фигурных скобок

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

        set a {xyz a {b с d}}

команда set получит два аргумента: а и xyz a {b с d}.

        Когда действуют двойные кавычки или фигурные скобки, парная закрывающая скобка или кавычки не должны обязательно быть на той же строке, что и ее открывающая. В этом случае символ новой строки будет включен в поле аргумента вместе со всеми остальными символами до закрывающей скобки или кавычек. Например, команда eval использует один аргумент, представляющий собой строку команды: eval вызывает интерпретатор Tcl для выполнения командной строки. Команда

        eval {
        set a 22
        set b 33
        }

присвоит значение 22 переменной а и значение 33 — переменной b.

        Если первый символ поля команды — не открывающая фигурная скобка, то ни открывающая, ни закрывающая фигурные скобки в этом поле не будут интерпретироваться специальным образом.

        Подстановка команд со скобками

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

        set a [set b]

        Когда у команды set задан только один _аргумент, тогда это есть имя переменной, и set возвращает значение этой переменной. В этом случае, если переменная b имеет значение foo, то предыдущая команда эквивалентна команде

        set a foo

        Квадратные скобки можно использовать более сложными способами. Например, если переменная b имеет значение foo переменная с имеет значение gorp, то команда

        set a xyz[set b].[set с]

эквивалентна команде

        set a xyzfoo.gorp

        Команда в квадратных скобках может содержать несколько команд, разделенных обычным образом — строками или точками с запятой. В этом случае для подстановки используется значение последней команды. Например, последовательность команд

        set a x[set b 22
        expr $b+2]x

эквивалентна команде

        set a x24x

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

        Подстановка переменных с $

        Символ доллара $ можно использовать в качестве краткой формы для подстановки переменных. Если у аргумента, не заключенного в фигурныё скобки, имеется символ $, то выполняется подстановка переменной. Символы после $ вплоть до первого символа, не являющегося цифрой, буквой или подчеркиванием, считаются именем переменной, и строковое значение этой переменной подставляется вместо ее имени. Например, если переменная foo имеет значение test, то команда:

        set a $foo.c

эквивалентна команде

        set a test.с

        Существует две специальные формы для подстановки переменных. Если следующим после имени переменной является открывающая скобка, то переменная считается именем массива, и все символы между открывающей скобкой и следующей закрывающей скобкой считаются индексом внутри этого массива. Команды и переменные, используемые в качестве индекса, обрабатывается перед операцией извлечения элемента массива. Например, если переменная х есть массив и один его элемент по имени first имеет значение 87, а второй по имени 14 — значение mоrе, то команда:

        set a xyz$x(first)zyx

эквивалентна команде

        set a xyz87zyx

        Если переменная index имеет значение 14, то команда:

        set a xyz$x($index)zyx

эквивалентна команде

        set a xyzmorezyx

        Массивы

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

        set abc${foo}bar

эквивалентна команде

        set abctestbar

        В аргументе, заключенном в фигурные скобки, не выполняется подстановка переменных: символ доллара и имя переменной передаются аргументу без изменения.

        Аббревиатура с символом доллара есть просто сокращенная форма: полностью эквивалентна [set а] и используется только для удобного сокращения количества печатаемых символов.

        Разделение команд точкой с запятой

        Обычно каждая команда занимает одну строчку (команда заканчивается символом новой строки). Символ точки с запятой также считается разделителем команд: можно поместить несколько команд в одной строке, разделив их точками с запятой. Точки с запятой не считаются разделителями команд, если они находятся внутри фигурных скобок или двойных кавычек.

        Подстановки с обратным слешем

        Обратный слеш можно использовать для ввода непечатаемых символов в поля команд и для вставки специальных символов (например, фигурных скобок или двойных кавычек) в поля без описанной выше специальной интерпретации этих символов. Ниже перечислены различаемые интерпретатором Tcl последовательности с обратным слешем. В каждом случае последовательность с обратным слешем замещается указанным символом:

        Пример:

        set a \{x\[\\0yz\141

второй аргумент команды set будет {x[\0yza.

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

        Например, в команде:

        set \*a \\\{foo

первый аргумент для set будет \*а, а второй — \{foo.

        Если аргумент заключен в фигурные скобки, то последовательности с обратным слешем внутри аргумента будут распознаны, но подстановки не будут выполнены (за исключением пары обратный слеш — новая строка): последовательности с обратным слешем передаются в аргумент как есть, без какой-либо специальной интерпретации символов в последовательностях. В частности, в такой ситуации фигурные скобки не означают поиска соответствующей парной скобки, заканчивающей аргумент. Например, в команде:

        set a {\{abc}

второй аргумент команды set будет \{abc.

        Данный механизм обратного слеша недостаточен для создания аргумента абсолютно любой структуры; он только обеспечивает наиболее общие случаи. Для создания особенно сложного аргумента, возможно, самым простым вариантом будет использование команды format совместно с подстановкой команды.
Hosted by uCoz