for — 반복 루프

for — 반복 루프

정해진 횟수만큼 같은 작업을 반복해야 할 때, C 언어의 for와 비슷한 구조의 for 명령어를 써요. 초기화, 조건, 갱신을 한 줄에 모아두기 때문에 루프 전체 흐름이 한눈에 들어와요.

출처: Tcl Built-In Commands — for

본문

시그니처

for start test next body

for는 구조가 C 언어의 for 문과 비슷한 반복 명령어예요. start, next, body 인자는 Tcl 명령어 문자열이어야 하고, test는 표현식(expression) 문자열이에요.

동작 순서는 이렇게 흘러가요.

  1. 먼저 Tcl 인터프리터로 start를 실행해요.
  2. test를 표현식으로 평가해요. 결과가 0이 아니면 body를 실행하고, 이어서 next를 실행한 뒤 다시 루프를 반복해요.
  3. test가 0으로 평가되면 명령어가 끝나요.

body에서 continue를 호출하면 현재 실행 중인 body의 남은 명령을 건너뛰고 곧바로 next를 실행한 뒤 test를 평가하는 식으로 진행돼요. bodynext에서 break를 호출하면 for는 즉시 반환해요. breakcontinue의 동작은 C의 대응 문장과 비슷해요. for는 항상 빈 문자열을 반환해요.

주의: test는 거의 항상 중괄호로 감싸야 해요. 그렇지 않으면 for가 실행을 시작하기 전에 변수 치환이 일어나 버려서, 루프 본문이 바꾼 변수 값이 표현식에 반영되지 않아요. 그러면 대부분 무한 루프가 돼요. test를 중괄호로 감싸면 변수 치환이 표현식 평가 때로 미뤄지므로(매 반복 전에) 변수 값의 변화가 제대로 보여요.

예제

0부터 9까지 각 정수에 대해 한 줄씩 출력해요:

for {set x 0} {$x<10} {incr x} {
    puts "x is $x"
}

반면 중괄호 없이 쓰면 무한히 돌거나 아예 돌지 않을 수 있고 오류가 날 수도 있어요. 실행 전에 변수 x가 존재하는지와 값이 10보다 작은지에 따라 동작이 갈리는데, 표현식이 for 실행 전에 치환되기 때문이에요:

for {set x 0} $x<10 {incr x} {
    puts "x is $x"
}

1부터 1024까지 2의 거듭제곱을 출력해요:

for {set x 1} {$x<=1024} {set x [expr {$x * 2}]} {
    puts "x is $x"
}

더 알아보기