Поиск…


Синтаксис

  • если expr1? то? body1 elseif expr2? то? body2 ...? else? ? BodyN?
  • для запуска теста следующего тела
  • а тестовое тело
  • foreach varlist1 list1? varlist2 list2 ...? тело

замечания

Документация: break , for , foreach , if , switch , uplvel , while

Добавление новой структуры управления в Tcl

В Tcl структура управления - это просто еще одна команда. Это одна из возможных реализаций do ... while / do ... until структуры управления.

proc do {body keyword expression} {
    uplevel 1 $body
    switch $keyword {
        while {uplevel 1 [list while $expression $body]}
        until {uplevel 1 [list while !($expression) $body]}
        default {
            return -code error "unknown keyword \"$keyword\": must be until or while"
        }
    }
}

Общим для обоих видов do -loops является то, что скрипт с именем body всегда будет выполняться хотя бы один раз, поэтому мы сразу это сделаем. uplevel 1 $body означает «выполнить скрипт на уровне стека вызывающего». Таким образом, все переменные, используемые скриптом, будут видны, и любые полученные результаты останутся на уровне вызывающего абонента. Затем сценарий выбирает на основе параметра keyword , следует ли итерации, пока условие истинно или пока оно не будет ложным, что совпадает с итерацией, в то время как логическое отрицание условия истинно. Если задано непредвиденное ключевое слово, создается сообщение об ошибке.

если / while / для

если expr1 ? то? body1 elseif expr2 ? то? body2 ...? else? ? bodyN?

exprN - выражение, которое вычисляет логическое значение. bodyN - список команд.

set i 5
if {$i < 10} {
  puts {hello world}
} elseif {$i < 70} {
  puts {enjoy world}
} else {
  puts {goodbye world}
}

для запуска теста следующего тела

start , next и body - списки команд. test - выражение, которое вычисляется в виде булевых значений.

Команда break выйдет из цикла. Команда continue перейдет к следующей итерации цикла.

Общее использование:

for {set i 0} {$i < 5} {incr i} {
  puts "$i: hello world"
}

Поскольку start и next являются списками команд, любая команда может присутствовать.

for {set i 0; set j 5} {$i < 5} {incr i; incr j -1} {
  puts "i:$i j:$j"
}

а тестовое тело

Тест представляет собой любое выражение, которое вычисляет логическое значение. Пока тест верен, тело выполняется.

set x 0
while {$x < 5} {
  puts "hello world"
  incr x
}

Команда break выйдет из цикла. Команда continue перейдет к следующей итерации цикла.

set lineCount 0
while {[gets stdin line] >= 0} {
  puts "[incr lineCount]: $line"
  if { $line eq "exit" } {
    break
  }  
}

Список итераций: foreach

Еогеасп varlist1 песни1? varlist2 list2 ...? тело

foreach - это мощная структура управления, которая позволяет циклически перебирать список или несколько списков.

set alpha [list a b c d e f]
foreach {key} $alpha {
   puts "key: $key"
}

Можно указать несколько имен переменных.

set alphaindexes [list a 1 b 2 c 3 d 4 e 5 f 6]
foreach {key num} $alphaindexes {
   puts "key:$key num:$num"
}

Одновременно можно перебирать несколько списков.

set alpha [list a b c d e f]
set indexes [list 1 2 3 4 5 6]
foreach {key} $alpha {idx} $indexes {
   puts "key: $key idx:$idx"
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow