Sök…


Syntax

  • om expr1? då? body1 annarsif expr2? då? body2 ...? annars? ? BodyN?
  • för starttest nästa kropp
  • medan testkroppen
  • förhand varlist1 lista1? varlist2 list2 ...? kropp

Anmärkningar

Dokumentation: break , for , foreach , if , switch , uplevel , while

Lägga till en ny kontrollstruktur till Tcl

I Tcl är en kontrollstruktur i princip bara ett annat kommando. Detta är en möjlig implementering av en do ... while / do ... until kontrollstrukturen.

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"
        }
    }
}

Gemensamt för båda typerna av do -loops är att skriptet som heter body alltid kommer att genomföras åtminstone en gång, så vi göra det direkt. uplevel 1 $body betyder "köra skript på den som ringer stack stack". På detta sätt kommer alla variabler som används av skriptet att vara synliga, och alla resultat som produceras kommer att förbli på den som ringer. Skriptet väljer sedan, baserat på keyword , om det ska upprepas medan ett villkor är sant eller tills det är falskt, vilket är detsamma som att iterera medan villkorets logiska negering är sant. Om ett oväntat nyckelord ges skapas ett felmeddelande.

om / medan / för

om expr1 ? då? body1 annarsif expr2 ? då? body2 ...? annars? ? bodyN?

exprN är ett uttryck som utvärderas till ett booleskt värde. bodyN är en lista med kommandon.

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

för starttest nästa kropp

start , nästa och kroppen är listor med kommandon. test är ett uttryck som utvärderas till booleska värden.

Break- kommandot kommer att bryta ur slingan. Den fortsätter kommandot hoppar till nästa iteration av slingan.

Den vanliga användningen är:

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

Eftersom start och nästa är listor med kommandon, kan alla kommandon vara närvarande.

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

medan testkroppen

Testet är alla uttryck som utvärderas till ett booleskt värde. Medan testet är sant, körs kroppen .

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

Break- kommandot kommer att bryta ur slingan. Den fortsätter kommandot hoppar till nästa iteration av slingan.

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

Lista iteration: förhand

förhand varlist1 lista1 ? varlist2 list2 ...? kropp

foreach är en kraftfull kontrollstruktur som gör det möjligt att loopa över en lista eller flera listor.

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

Flera variabla namn kan anges.

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

Flera listor kan itereras över samtidigt.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow