Быстрое введение в Tcl: группировки

10:04:00




Для тех, кто попустил - вот первый урок.
Тема нашего сегодняшнего урока – подстановки при обработки программы в языке Tcl.
В языке программирования Tcl обработка команды происходит в две фазы:

  1. фаза подстановки (именно на этой фазе осуществляется как таковое метапрограммирвоание, но об этому чуть позже);
  2.  фаза выполнения.

В фазе подстановки происходит та самая «магия», которая свойственна  языкам семейства lisp, Forth, Tcl, а теперь и Perl6. Большинство работы в Tcl программе приходится именно на эту фазу.

Интерпретатор просматривает каждое слово слева направо (да-да, в Tcl используется «польская» нотация, т.е. программы читаются справа-налево, а не слева на право)  и, когда находится слово, которое должно быть заменено другим значением, он производит подстановку. На этом принципе держится понятие макросов в Tcl. Забегая вперед скажу, что макросы – это некие функции, которые позволяют программе в режиме реального времени «дописывать» свой же исходный код. Именно эта особенность языка Tcl (фаза подстановки) и является наиболее значимой, т.к. позволяет делать практически что угодно. Ведь у нас в руках не просто язык программирования, а программируемый язык программирования, что означает – мы можем расширять его по своему усмотрению. А это дает практически безграничные возможности.

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

Стоит помнить, что подстановка происходит только один раз! Интерпретатор Tcl производит следующие подстановки:
  • Заменяет $имяПеременной заменяет на значениеПеременной.
    В примере, Z присваивается значение "Москва". Когда puts "$Z_LABEL $Z" обрабатывается слово $Z_LABEL заменяется на строку "Столица России это:", и $Z заменяется на "Москва" до того, как puts выводит строку на экран.
  • Специальная последовательность после обратной дроби ("Backslash Sequence" или "Escape Sequence") заменяется на символ с соответствующим кодом:
строка
выводимое значение
шестнадцатеричное значение
\a
Звуковой сигнал (звонок)
\x07
\b
Backspace - стирание влево
\x08
\f
Очистка экрана
\x0c
\n
Новая строка
\x0a
\r
Enter
\x0d
\t
Tab - Табуляция
\x09
\v
Вертикальная табуляция
\x0b
\ddd
Восьмеричное значение
d = 0-7
\xhh
Шестнадцатеричное значение
h = 0-9,A-F,a-f
  • Заменяется любая команда в квадратных скобках на значение, возвращаемое после выполнения этой команды (более детально это будет рассмотрено в пятом упражнении)
  • Заменяется \конецСтроки на пробел, а следующая строка присоединяется к текущей. Некоторые команды очень длинны, и неудобно помещать их в одну строку. Данная подстановка позволяет разбить длинную строчку на несколько коротких.
Слова в двойных кавычках или фигурных скобках обрабатываются как один аргумент. Вроде бы все просто, но(!) по своей сути – это разные сущности и действуют они по разному (хотя и схожи в результате).

Объединение слово в двойных кавычка позволяет делать замены в фазе подстановки, например:
puts "Текущее значение переменной - $имяПеременной"

заменит имя переменной на её значение и выведет всю строку.

Исключение делается для символов после обратной дроби (\), как и описано ранее. Данная особенность пришла в Tcl из императивных языков, таких как Pure C, где символ обратной дроби активно используется для работы со строками.

По своей сути - обратная дробь просто отменяет подстановку для следующего символа. Это даёт возможность выводить специальные символы - $, ", [, ], {, }, \ (а так же реализовывать достаточно интересные вещи в макросах, но об этом мы поговорим намного позже).
Выполните простой пример:

# Пример действия \ на символ $
set Z "Мордор"
set Z_LABEL "Владения Саурона: "
puts "$Z_LABEL $Z"
puts "$Z_LABEL \$Z"

# В следующей строке не хватает \ перед $
puts "\nБен Франклин изображен на купюре $100.00"
set a 100.00
puts "Вашингтона нет на купюре $a" ;# Это не то
puts "Линкольна нет на купюре $$a" ;# Это правильно
puts "Гамильтона нет на купюре \$a" ;# Опять не то
puts "Бен Франклин на купюре \$$a"    ;# Но вот так правильно

puts "\n................. примеры специальных символов"
puts "Табуляция\tТабуляция\tТабуляция"
puts "Эта строка будет выведена\nна двух линиях"
puts "А эта строка выведется\ на одной линии"
Как действуют фигурные скобки? Все просто, если двойные кавычки позволяют произвести замену, то фигурные скобки, наоборот, отключают замену.
Слова, объединённые фигурными скобками выводятся без изменения. В языках метапрограммирования такое действие называется «цитированием кода». Так, например, строка

{$имяПеременной}

будет обработана как $имяПеременной, а не как-то иначе. Т.е. подстановки не будет! На фазе подстановки в фигурных скобках заменяется только обратная дробь (\) в конце строки, чтобы обрабатывать несколько строк как одну.

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

Приведем пример работы с фигурными скобками:
set Z "Мордор"
set Z_LABEL "Владение саурона -"
 
puts "\n................. примеры различия между  \" и \{"
puts "$Z_LABEL $Z"
puts {$Z_LABEL $Z}
 
puts "\n....... примеры совместного использования \{ и \""
puts "$Z_LABEL {$Z}"
puts {Сегодня сообщили: "Стоимость земли – 1 гектар = 1000 рублей"}
 
puts "\n................. примеры специальных символов"
puts {Внутри скобок замена не производится \n \r \x0a \f \v}
puts {Однако, в конце строки\обратная дробь интерпретируется как пробел.}

Большинство задач компьютерного программирования заключается в манипуляции данными с помощью команд, и сохранении данных для того, чтобы в последующем использовать их в другой команде. В языке Tcl все есть строка, т.е. даже ваш код – является данными. А это означает – и его можно не только обработать (выполнить), но им можно управлять, манипулировать…

Один из инструментов работы с исходным кодом - квадратные скобки ([ ]). В них заключается результат выполнения команд.

Работает это примерно так:

  1. Интерпретатор Tcl получает код.
  2. На фазе обработки/подстановки, когда интерпретатор Tcl получает команду в квадратных скобках, он начинает её обрабатывать отдельно.
  3.  Вначале производятся замены, а затем команда выполняется как будто она находится на отдельной строке без квадратных скобок (замети, что результат выполнения заменяет команду в скобках, и интерпретатор продолжает обрабатывать строку далее).

Что нам это дает? А вот задумайтесь. Интерпретатор считает строку в квадратных скобках командой. А каждая команда обрабатывается в две фазы - подстановка и выполнение. Результат же выполнения подставляется на место команды в квадратных скобках. Таким образом мы получаем бесконечную глубину исполнения кода, который мы можем модифицировать как нам вздумается! Но это потом. А пока обратимся к практике:

set y [set x "еклмн"]

Помните, что команда set возвращает значение, которое оно присвоило переменной? Если нет – обратитесь к нашему первому уроку.

В этом коде set присваивает значение "еклмн" переменной x. При выполнение строки эта команда будет выполнена и вместо квадратных скобок будет новое значение переменной x. таким образом, строка примит вид:

set y "еклмн"


Данная команда будет выполнена и значение "еклмн" присвоится переменной y.
Из этого правила есть два исключения:
  • Если перед квадратной скобкой стоит \, то она воспримется просто как буква.
  • Внутри фигурных скобок квадратные скобки не действуют.
Выполните пример, и посмотрите как работают скобки и кавычки.
set x "абв"
puts "Простая замена: $x\n"
 
set y [set x "еклмн"]
puts "Запомните, что set возвращает новое значение переменной: X: $x Y: $y\n"
 
set z {[set x "Эта строка в кавычках внутри квадратных скобок."]}
puts "Помните о фигурных скобках: $z\n"
 
set a "[set x {Эта строка в фигурных скобках внутри кавычек.}]"
puts "В данном случае команда set выполняется: $a"
puts "значение \$x : $x\n"
 
set b "\[set y {Эта строка в фигурных скобках внутри кавычек.}]"
puts "Помните, \\ обратная дробь отключает скобки:\nзначение \$b : $b"
puts "значение \$y : $y"

Вам так же может быть интересны

0 коммент.

Дорогие друзья! Будем уважать друг друга и не превращать данный блок в linux.org.ru

Мы в социальных сетях

Контакты

  • ООО "Миллениум. Интеграция"
  • Контактный телефон: +7 (919) 932-86-97
  • Электронная почта: написать нам!