Введение в TCL

На этой странице представлено введение в командный интерпретатор TCL. При подготовке данного раздела использовались следующие материалы:

Так же рекомендуем программу-самоучитель для языка tcl: TclTutor
http://www.msen.com/~clif/TclTutor.html
Эта программа выполнена на языке tcl. Распространяется бесплатно.
Функционирует на всех ОС где функционирует tcl

Все перечисленные материалы материалы резрешены авторами к некоммерческому использованию.


Авторы не несут никакой ответственности за возможные проблемы, которые могут возникнуть при использовании советов и рекомендаций данного документа.

1. Введение.

1.1 Адресуемая аудитория.

Это документ предназначен в первую очердь для тех, кто не имеет времени, желания или возможности изучать новый язык программирования. Учитывая специфику сайта, мы постараемся наиболее кратко изложить основы TCL: объявляние переменных, массивов, процедур, манипуляции с ними в пределах, необходимых для эффективного использования TCL в сетевом имитаторе ns2. Кроме того, анализ результатов поиска в основных русскоязычных поисковых системах показывает, что на сегодняшний день не существует русскоязычного ресурса посвященному языку TCL.

Учитывая условия сложившиеся на российском рынке операционных систем и программного обеспечения можно констатировать, что системы класса UNIX (FreeBSD/Linux) не получили в России достаточного широкого распространения. Это отразилось также и на развитие языка TCL, разработанного и ориентированного в первую очередь на UNIX системы. Так, на русском языке не издано пока ни одной книги о TCL, поэтому изучение TCL для в нашей стране связано с достаточным большим количеством трудностей.

Данный документ познакомит читателя с основами TCL.

1.2 Место и структура TCL.

Документ построен следующим образом. В первой части даются основные понятия языка TCL, рассматривается его структура и возможности, проводится сравнение TCL с аналогичными языками программирования (Perl, Python).

1.3 Что такое TCL?

TCL (Tool Command Language) является интерпретируемым языком программирования по собственным характеристикам и возможностям схожим с Perl. Название произносится как "tickle" ("тикл"). Фактически TCL состоит из командного интерпретатора и библиотеки. В первую очередь TCL - простой язык обработки текстовой информации, предназначенный прежде всего для создания команд для интерактивным программам типа текстовых редакторов, отладчиков, и оболочек. TCL имеет достаточно простой синтаксис и, кроме того, является программируемым. Пользователи TCL могут легко создавать новые команды, для создания нового, более мощного синтаксиса.

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

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

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

1.4 Интерпретатор TCL

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

2. Типы данных TCL

TCL поддерживает только один тип данных: строки. Учитывая это, все параметры передаваемые командам, все команды, и все переменные являются строками. В тех случаях когда команды требуют числовых параметров или возвращают числовые значения они интерпретируются как строки. Необходимо отметить, что многие команды ожидают параметры в определенном формате, однако анализ и конвертация строк-параметров в необходимый формат является задачей самих команд. Так , например, параметры команд часто содержат непосредственно команды TCL, которые должны быть выполнене как часть команды (set y [set z 10]).

Существует три общих формы интерпретации, которые принимают строки: команды, выражения, и списки. Последующие три раздела посвящены именно им.

2.1 Синтаксис команд TCL

Синтаксис TCL подобен синтаксису Bourne aganin shell (bash) UNIX/Linux. Однако интерпретация команд отлична от стандартной оболочки UNIX. Команда TCL состоит из одной или нескольких команд разделенных символом новой строки или символом "точка с запятой"(;). Каждая из команд является набором полей разделенных пробелами или сомволом табуляции. Первое из полей обязательно имя команды, дополнительные поля (если определены командой и существуют) - параметры данной команды. Так например команда:

set x 22

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

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

Необходимо отметить, что имена команд TCL в общем случае должны набираться полностью, бех сокращений. Однако, если интерпретатор TCL не может распознать команду, он вызывает специальную команду unknown, которая пытается найти и/или создать команду. Так, например, команда unknown анализирует каталоги библиотеки поиска заданной команды. На практике команда unknown завершает команду напечатанную с сокращением ("отброшенными буквами в конце команды"), однако это справедливо только для интерактивного режима. Этот эффект известен в среде bash как Command Line Сompletion. Необходимо отметить, что в отличие от bash, TCL не завершает команду даже в интерактивном режиме по передаче какого-либо кода от стандартного устройства ввода. Завершение команды происходит в процессе интерпретации! Пользователь таким образом не может визуально контролировать команду, переданную на исполнение. В общем случае не рекомендуется использовать сокращения для команд так как это может привести к нежелательным эффектам.

2.2 Комментарии

Если первый не пробельный символ команды TCL является знак "#", то вся введенная информация от данного "#" до символа новой строки интерпретируется как комментарий и игнорируется при исполнении:

# Это комментарий

Во избежание проблем возникающих с некоторыми редакторами, использующими для идентификации новой строки не стандартные символы рекомендуется всегда использовать в качестве символа завершения команды ";", а в качестве комментария слеудющую последовательность:

;# Это коментарий

2.3 Группировка параметров двойными кавычками

Обычно параметры команд разделяются пробельными символами и, следовательно параметры, заданные таким образом не могут содержать пробельных символов. TCL предоставляет специальный способ использовать пробельные символы внутри параметров. Для таких целей используется символ двойных кавычек - ". Таким образом, если параметр команды начинается с двойных кавычек, он закакнчивается не пробельным символом, а символом двойных кавычек. Необходимо отметить, что двойные кавычки не входят в параметр, передаваемый команде. Так например строка:

set x "Параметр с пробельными символами"

передаст два параметра команде set: x и Параметр с пробельными символами. Необходимо отметить, что в пределах двойных кавычек осуществляется подстановка переменных и команд. Кроме того, если первый символ поля - не двойные кавычки, то они не принимают никакую специальную интерпретацию в синтаксическом анализе этого поля:

set x Пар"аметр

2.4 Группировка параметров скобками

Изогнутые скобки "{" и "}" могут также использоваться для группировки параметров. Нои имеют два отличия от двойных кавычек. Во-первых в командых TCL можно использовать вложенные скобки. Это делает их более легкими для использования для сложных параметров подобно вложенным строкам команды TCL. Во-вторых, в пределах изогуных скобок не производится подстановка переменных и команд TCL. Строка:

set x {set x 10}

передает команде set два параметра: x и set x 10. Таким образом, переменная будет установлена в значение set x 10.

Если поле параметра начинается со скобок, изогнутых в левую сторону ("{"), то параметр передаваемый команде заканчивается соответствующими скобками, изогнутыми в правую сторону ("}"). Аналогично двойным кавычкам, интерпретатор TCL удаляет наиболее удаленные изогнутые скобки из значения параметра. Остальная часть поля передается команде без изменений. Так, напрмер строка:

set x {Good {work}}

передаст команде set два параметра: x и Good {work}

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


eval {
	set x 22;
	set y 33;
}

присвоит значение 22 переменной $x и 33 переменной y.

Если первый символ поля - не изогнутые влево скобки, то символы "{" и "}" не принимают никакую специальную интерпретацию в синтаксическом анализе этого поля параметра.

2.5 Подстановка команд

Если в пределах поля параметра появляется левая квадратная скобка ("[") в поле происходит подстановка команды (за исключением поля ограниченного изогнутыми скобками!). Весь текст, расположенный от данной левой квадратной скобки до соответствующей закрывающей правой квадратной скобки интерпретируется как TCL команда и выполняется до исполнения команды, в поле которой она находится. Рассмотрим команду:

set x [set y]

Команда set имеет единственный параметр set y Команда set y возвращает содержание переменной y. В этом случае, если переменная b имеет значение Joe, то указанная команда эквивалентна:

set x Joe

Квадратные скобки могут огранизовывать более сложные структуры. Так, например, если переменная x имеет значение Joe, а переменная y имеет значение Sakic, то команда:

set name [set x].[set y]

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

set name Joe.Sakic

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

set Before[set b 22; expr $b+2]After

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

set Before24After

Если поле параметра ограничено изогнутыми скобками, квадратные скобки в его пределах не интерпретируются! Так команда:

set x {[set y]}

Присвоит переменной x значение [set y].

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

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

set x Joe;
set y $x;

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

set y Joe

Существует две формы для подстановки переменный. Если следующий символ после названия переменной - открывающая круглая скобка, то переменная является именем массива, и все символы между открывающей круглой скобкой и следующей ближайшей закрывающей круглой скобкой являются индексом в массиве. Необходимо отметить, что в пределах круглых скобок, задающих индекс массива может использоваться подстановка переменных. Например, если переменная myArray - массив из двух элементов, индекс певого first и значение Value of the first, индекс второго second и значение Value of the second, то команда

set x $myArray(first);

является эквивалентным команде:

set x "Value of the first";

Рассмотрим другой пример:

set y second;
set x $myArray($y);

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

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

set y ${x}Sakic

является эквивалентным команде:

set y JoeSakic

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

Следует отметить, что знак доллара является просто сокращением общей формы [set var]. Так напрмер, запись $var является сокращенной формой [set var].

2.7 Разделение команд точкой запятой (";")

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

2.8 Подстановка через backslash (Наклонная черта, "\")

Backslash используеются для вставки непечатных символов в поля параметров команд. Кроме того, backslach позволяет вставлять специально интерпретируемые символы как было описано выше. Последовательности реализуемые при помощи backslash и корректно интерпретируемые TCL, перечислены ниже. В каждом случае, backslash-последовательность заменяется на указанный символ:

Примеры:

Необходимо отметить, что backslash за которым следуют символы, отличные от перечисленных выше, инетрпретируется TCL как обычная косая черта ("\").

set x \Joe

Переменная x будет установлена в \Joe.

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

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

2.9 Резюме

4. Выражения

Выражения являются неотъемлимой составляющей любого языка программирования. Несколько TCL команд, таких как expr, for или if, обрабатывают один или большее количество параметров как выражения и вызывают обработчики выражений TCL (Tcl_ExprLong, Tcl_ExprBoolean, и т.д.) для их оценки. Операторы, разрешенные в выражениях TCL - подмножество операторов, разрешенных в выражениях C, и они имеют то же самое значение и старшинство как соответствующие операторы C. Выражения почти всегда выдают числовые результаты (целое число или значения с плавающей точкой). Так, например, выражение

8.2 + 6

будет равно (!!!) 14.2. Выражения TCL отличаются от выражений C методыми определения. Кроме того выражения TCL поддерживают нечисловые операнды и сравнения строк.

Выражения TCL состоят из комбинации операндов, операторов и круглых скобок. Пробельные символы и символы табуляции прианализе выражений игнорируются. Там, где это возможно операнды интрепретируются как целочисленные значения. Целочисленные значения могут быть определены в десятичной, восьмеричном (если первый символ операнда - "0"), или в шестнадцатеричном виде (если первые два символа операнда - "0x"). Если операнд не принадлежит ни к одного из целочисленных форматов, приведенных выше, то он будет обработан как число с плавающей запятой (если это возможно). Числа с плавающей запятой могут быть определены аналогично стандартному ANSI C. Например, все следующие записи идентичны: 2.1, 2., 2e1, 2.0e+1.

Операнды могут быть определены одним из следующих способов:

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

Предположим, что переменная x имеет значение 3, переменная b имеет значение 6. Рассмотрим несколько примеров:

3.1 + $a (6.1)
2 + "$a.$b" (5.6)
4 * [llength " 6 2 "] (8)

Для получения сведений об операторах TCL обращайтесь к документации по ANSI C.


Автор: Дмитрий Молчанов

last updated Sun, August 29, 2004 19:37 by Yevgeni Koucheryavy