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

11:32:00

Данный урок посвящен... Управлению ходом выполнения программы. Для этого в языке программирования Tcl есть два основных оператора - swutch и if. Процедура switch позволяет вам сравнивать строку с другими (но не сопоставлять с образцом - не стоит путать эти понятия). Это дает возможность описать достаточное большое количество вариантов действия для хода программы. Альтернативой - является оператор if (если вы смотрите наши видеоуроки по языку Python3 - знаете, что им можно заменить switch, по крайней мепе функционально.

Для начала рассмотрим команду if. Её синтаксис имеет вид:

if условие1 ?then? команда1 elseif условие2 ?then? команда2 elseif ... ?else? командаN

Слова then и else не обязательны - их указывают в основном для улучшения читабельности кода. Я почти всегда их опускаю.

Когда поступает команда if, виртуальная машина Tcl вычисляет условие с помощью команды expr (это особенная команда - о ней мы еще поговорим, но в последующих уроках). Последняя является одной из комманд, на которых держатся вся система макросов. Если результат - истина, то выполняется команда1. Если получилась ложь - проверяется слово после команды1. Если следующее слово elseif (аналог elif на языке Python), тогда проверяется следующее условие, а если следующее слово else, тогда выполняется последняя команда.

Условие должно возвращать одно из следующих значений (в зависимости от того, где оно применяется):


ЛожьИстина
число0все остальные значения
yes/nonoyes
true/falsefalsetrue

Но чаще всего все же - False/True. Это классическое сочетание/классическая пара булевых значений. Для группировки операторов после If используют двойные кавычки или фигурные скобки. Последнее - удобнее, является общепринятым стандартом. Кавычки - используются когда надо провести замену на стадии подстановки. Т.к. при вычислении функции if (а этот "оператор" - по сути своей вычисляемая булева функция) - будет выполнена дополнительная замена, т.е. будут осуществлены две подстановки.
 Так как условие в if выполняется так же, как и в команде expr, шестнадцатеричные строки вида 0xNN будут преобразованы в числовой эквивалент перед вычислением (помните - все в Tcl есть строка!). Условие в if проверяется так же, как работает команда expr.

if {$i == 1} {puts "РАВНО"}

эквивалентно следующему:

if {[expr $i == 1]} {puts "РАВНО"}

Команда (т.е. код внутри if/else) тоже может быть заключена в кавычки или скобки. Так как команда будет выполнена аналогично любой другой команде Tcl, то даже в фигурных скобках подстановка будет произведена. Получаем опять же - бесконечную глубину вложений. Рассмотрим небольшой пример с применением функции/команды/макроса (прим. автора - чем больше я занимаюсь Tcl, тем больше прихожу к мнению, что все это правильно назвать процедурой и воспринимать как однородное нечто для языка).

Пример:

set x 1;
if {$x == 2} {puts "$x равно 2"} else {puts "$x не равно 2"}
if {$x != 1} {
 puts "$x != 1 (не равно)"
} else {
 puts "$x равно 1"
} 
 
if $x==1 {puts "Получили 1"}
;# На тестовой строке будут проведены две фазы подстановки
;#  Первая фаза заменит $y на x
;#  При выполнении команды if, $x будет заменён на 1
set y x; 
 
if "$$y != 1" {
 puts "$$y != 1"
} else {
 puts "$$y равно 1"
}
 
Что интересно, в циклах - так же осуществляется подобная проверка. У языка Tcl всего два цикла - while и for. Как и if, они проверяют условие тем же способом, что и expr. В этом уроке рассматривается команда while, а в следующем - for. Можно сказать, что оба цикла являются взаимозаменяемыми. Исторически так сложилось - большинство программистом не любят while, т.к. for им кажется проще. Но это не так!
Синтаксис команды while следующий:

while условие команда

Когда виртуальная машина Tcl встречает слово "while", он сразу вычисляет условие. Если условие истинно, исполняется написанный код, затем опять проверяется вычисляется условие. Если условие верно, тогда код выполняется опять. Этот процесс продолжается до тех пор, пока условие не даст ложь, или до появления команды break (специальный оператор, которые позволяет выйти с цикла до выполнения условия).

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

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

Рассмотрим еще один пример. Для самопроверки - ответьте, зачем используется команда break.

Пример:

set x 1;
while {$x < 5} {puts "значение x = $x"; set x [expr $x + 1]}
puts "Первый цикл закончился при X равном $x\n"
# Сколько раз выполнится этот цикл?
# Почему он не выводит значение каждый раз?
set x 0;
while "$x < 5" {
 set x [expr $x + 1]
 if {$x > 6} break;
  if "$x > 3" continue;
 puts "значение x = $x"; 
}

puts "Второй цикл завершился при X равном $x\n"

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

0 коммент.

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

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

Контакты

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