Страница 1 из 1

TCL - как это работает?

СообщениеДобавлено: 10 июл 2010 00:59
tvrsh
Информация взята из четвёртого издания Брэнта Уэлша и Кена Джонса "Практическое программирование на Tcl и Tk".
Перевод на русский язык: v0id.
Взято с: http://kreon.net.ru/index.php?name=Pages&op=page&pid=1

TCL
Tcl - это аббревиатура от Tool Command Language. Команды выполняют различные действия, например: вывод строки, вычисление значения арифметического выражения или отображение компонентов (widget) на экране. В Tcl в виде команд представляются все действия, даже присвоение значений переменным и определение процедур. Для вызова команд в языке Tcl предусмотрены достаточно простые синтаксические конструкции. Все сложные действия выполняет интерпретатор, реализующий команды. Команда Tcl записывается в следующем виде:
        команда параметр1 параметр2 параметр3 ...

Команда может представлять собой либо встроенную команду Tcl, либо процедуру. Имя команды отделяется от параметров с помощью одного или нескольких пробелов или знаков табуляции; те же символы используются для разделения параметров. Символ конца строки или точка с запятой завершают команду. В процессе интерпретации Tcl осуществляет группировку (объединение нескольких слов в один параметр) и подстановку (замену переменных и вызовов вложенных процедур). Действия интерпретатора Tcl по обработке команд можно разделить на три этапа:
  1. Группировка параметров.
  2. Подстановка вложенных команд, переменных и символов, которым предшествует обратная косая черта.
  3. Вызов команды. Интерпретация параметров самой командой.

Подстановка переменных.
Для присвоения значений переменной используется команда set. Этой команде передаются два параметра: имя переменной и значение. Имя переменной может быть любой длинны; регистр символов учитывается. В составе имени допустимы любые символы. Для того, чтобы обратиться к значению переменной, надо указать перед её именем символ $.

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

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

Фигурные скобки и двойные кавычки.
Двойные кавычки и фигурные скобки используются для группировки нескольких слов в один параметр. Различие между ними состоит в том, что кавычки допускают подстановку в группе, а фигурные скобки запрещают её. Это правило действует по отношению к командам, переменным и последовательностям, начинающимся с обратной косой черты.
TCL: [ Скачать ] [ Скрыть ]
set s Hello
=> Hello
puts stdout "The length of $s is [string length $s]."
=> The length of Hello is 5.
puts stdout {The length of $s is [string length $s].}
=> The length of $s is [string length $s].


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

Квадратные скобки.
Квадратные скобки используются для подстановки команд и не выполняют группировку. Вместо этого вложенная команда, определяемая с помощью квадратных скобок, рассматривается как часть текущей группы. В приведённой ниже команде двойные кавычки формируют последний параметр, выполняя группировку, в результаты выполнения вложенной команды включаются в группу.
        puts stdout "The length of $s is [string length $s]."

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

Группировка перед подстановкой.
Интерпретатор Tcl выполняет разбор команды за один проход. В течение единственного прохода он принимает решение о группировке и подстановке. Группировка осуществляется перед подстановкой. Эту особенность интерпретатора Tcl необходимо иметь в виду при написании программ. Значения, полученные в результате подстановки, не влияют на группировку, так как решение о группировке было принято ранее.
Приведённый ниже пример демонстрирует влияние вложенных команд на группировку. Вложенная команда рассматривается как неразрывная последовательность символов, причём внутренняя структура этих символов не учитывается. При формировании параметров основной команды результаты подстановки включаются в текущую группу символов.
set x 7; set y 9
puts stdout $x+$y=[expr $x + $y]
=> 7+9=16

Второй параметр команды puts имеет следующий вид:
$x+$y=[expr $x + $y]

Пробелы в составе вложенной команды при группировке игнорируются. В тот момент, когда интерпретатор Tcl встречает левую квадратную скобку, подстановка некоторых переменных уже выполнена и сформирована следующая строка:
7+9=

При появлении левой квадратной скобки осуществляется рекурсивный вызов интерпретатора для выполнения вложенной команды. Перед выполнением expr подстановка переменных $x и $y уже выполнена. Результат выполнения команды expr включается вместо всей последовательности символов, находящихся между левой и правой квадратной скобкой. Поэтому команда puts получает в качестве второго параметра следующее значение:
7+9=16

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

Группировка математических выражений.
Команда expr выполняет некоторые действия по подстановке внутри фигурных скобок. В выражениях предполагающих подстановку переменных и команд, может выполняться группировка с помощью фигурных скобок. Это возможно потому, что в параметре команды expr подстановка осуществляется в два прохода: первый проход выполняет интерпретатор Tcl, а второй -- сама команда expr. Как правило, при этом проблемы не возникают, так как математические выражения не содержат символов, имеющих специальное значение. Второй проход подстановки необходим для поддержки while, if и других команд, в которых вычисляется значение логических выражений.
Группировка позволяет обеспечить более эффективное выполнение команд.
Чтобы команда expr самостоятельно выполняла подстановку команд и переменных, группировку необходимо выполнять с использованием фигурных скобок. В противном случае могут осуществляться нежелательные преобразования числовых значений в строковые и строковых - в числовые. Это замедляет выполнение программ, кроме того, в некоторых случаях преобразования могут влиять на точность вычислений.