Быстрое введение в 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/no | no | yes |
true/false | false | true |
Но чаще всего все же - 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 условие команда
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