+LOOP — 루프 종료

+LOOP — 루프 종료 (인덱스 +n)

+LOOP(plus-loop)는 루프 인덱스에 스텝 값 n을 더하고, 루프 한계 경계를 넘으면 루프를 종료하고 그렇지 않으면 루프 시작으로 분기하는 코어 단어예요.

출처: +LOOP — Forth 2012 Standard

본문

컴파일 (Compilation)

( C: do-sys -- )

아래 주어진 실행 시점 의미를 현재 정의에 추가해요. do-sys가 주는 위치와 다음 제어 이동 위치 사이에 있는, LEAVE의 미해결 발생 전부의 목적지를 해결해서 +LOOP 뒤의 단어들을 실행하도록 해요.

실행 (Run-time)

( n -- ) ( R: loop-sys1 -- | loop-sys2 )

루프 제어 매개변수를 사용할 수 없으면 애매한 조건이 존재해요. n을 루프 인덱스에 더해요. 루프 인덱스가 (루프 한계에서 1을 뺀 값)과 루프 한계 사이의 경계를 넘지 않았으면 루프의 시작에서 실행을 계속해요. 그렇지 않으면 현재 루프 제어 매개변수를 버리고 루프 바로 다음에서 실행을 계속해요.

참조 (See)

  • 6.1.1240 DO
  • 6.1.1680 I
  • 6.1.1760 LEAVE
  • A.6.1.0140 +LOOP

합리성 (Rationale)

전형적인 사용:

: X ... limit first DO ... step +LOOP ;

테스트 (Testing)

T{ : GD2 DO I -1 +LOOP ; ->  }T
T{        1          4 GD2 -> 4 3 2  1 }T
T{       -1          2 GD2 -> 2 1 0 -1 }T
T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
T{    4  4  -1 gd7 ->  4                  1  }T
T{    1  4  -1 gd7 ->  4  3  2  1         4  }T
T{    4  1  -1 gd7 ->  1  0 -1 -2  -3  -4 6  }T
T{    4  1   0 gd7 ->  1  1  1  1   1   1 6  }T
T{    0  0   0 gd7 ->  0  0  0  0   0   0 6  }T
T{    1  4   0 gd7 ->  4  4  4  4   4   4 6  }T
T{    1  4   1 gd7 ->  4  5  6  7   8   9 6  }T
T{    4  1   1 gd7 ->  1  2  3            3  }T
T{    4  4   1 gd7 ->  4  5  6  7   8   9 6  }T
T{    2 -1  -1 gd7 -> -1 -2 -3 -4  -5  -6 6  }T
T{   -1  2  -1 gd7 ->  2  1  0 -1         4  }T
T{    2 -1   0 gd7 -> -1 -1 -1 -1  -1  -1 6  }T
T{   -1  2   0 gd7 ->  2  2  2  2   2   2 6  }T
T{   -1  2   1 gd7 ->  2  3  4  5   6   7 6  }T
T{    2 -1   1 gd7 -> -1 0 1              3  }T
T{  -20 30 -10 gd7 -> 30 20 10  0 -10 -20 6  }T
T{  -20 31 -10 gd7 -> 31 21 11  1  -9 -19 6  }T
T{  -20 29 -10 gd7 -> 29 19  9 -1 -11     5  }T
T{  : gd8 bump ! DO 1+ bump @ +LOOP ; ->  }T
T{  0 MAX-UINT 0 ustep gd8 -> 256 }T
T{  0 0 MAX-UINT -ustep gd8 -> 256 }T
T{  0 MAX-INT MIN-INT step gd8 -> 256 }T
T{  0 MIN-INT MAX-INT -step gd8 -> 256 }T

테스트 보조 정의

VARIABLE gditerations
VARIABLE gdincrement
: gd7 ( limit start increment -- )
  gdincrement !
  0 gditerations !
  DO
    1 gditerations +!
    I
    gditerations @ 6 = IF LEAVE THEN
    gdincrement @
  +LOOP gditerations @
;
\ With large and small increments
MAX-UINT 8 RSHIFT 1+ CONSTANT ustep
ustep NEGATE CONSTANT -ustep
MAX-INT 7 RSHIFT 1+ CONSTANT step
step NEGATE CONSTANT -step
VARIABLE bump

더 알아보기 (Learn more)

출처: +LOOP — Forth 2012 Standard