\ Êîíñòðóêöèÿ âûáîðà CASE
\ ñ ó÷åòîì âîçìîæíîé âëîæåííîñòè îïåðàòîðîâ CASE
DECIMAL
VARIABLE CSP \ Óêàçàòåëü ñòåêà êîíòðîëÿ
6 CONSTANT L-CAS# \ Äîïóñòèìûé óðîâåíü âëîæåííîñòè
CREATE S-CSP L-CAS# CELLS ALLOT \ Ñòåê êîíòðîëÿ
S-CSP CSP !
: +CSP ( -> P) \ Äîáàâèòü óðîâåíü
CSP @ DUP CELL+ CSP !
;
: -CSP ( -> ) \ Óáðàòü óðîâåíü
CSP @ 1 CELLS - CSP !
;
: !CSP ( -> ) \ Èíèöèàëèçèðîâàòü óðîâåíü
SP@ +CSP !
;
: CSP@ ( -> A)
CSP @ 1 CELLS - @
;
: ?CSP ( -> ) \ Ïðîâåðèòü âûäåðæàííîñòü ñòåêà
\ SP@ CSP@ <> 37 ?ERROR ( ABORT" Ñáîé ñòåêà ïî CSP !")
-CSP
;
: CASE ( -> )
!CSP
; IMMEDIATE
: OF
POSTPONE OVER POSTPONE =
[COMPILE] IF POSTPONE DROP
; IMMEDIATE
: ENDOF
[COMPILE] ELSE
; IMMEDIATE
: ENDCASE
POSTPONE DROP BEGIN SP@ CSP@ =
0= WHILE [COMPILE] THEN REPEAT -CSP
; IMMEDIATE