+LOOP — 루프 종료
+LOOP — 루프 종료 (인덱스 +n)
+LOOP(plus-loop)는 루프 인덱스에 스텝 값 n을 더하고, 루프 한계 경계를 넘으면 루프를 종료하고 그렇지 않으면 루프 시작으로 분기하는 코어 단어예요.
본문
컴파일 (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