( safe DAY 15.04.2001 )

warning off

0 value sps

: :: : ;

: :noname
  sp@ to sps
  :noname
;

: :
  sp@ to sps :
;

:: ;
  sp@ sps <> -22 ?throw
  postpone ;
; immediate

: (do)
   2dup = -11 ?throw
;

: do
  postpone (do)
  [compile] do
; immediate

: checkAddr ( addr -- addr )
   dup 1 and
   over 0= or -9 ?throw
;

: addr:
   >in @ ' swap >in !
   : postpone checkAddr dup compile,
   postpone ; drop
;

: checkZero ( x -- x )
   dup 0= -10 ?throw
;

: zero:
   >in @ ' swap >in !
   : postpone checkZero dup compile,
   postpone ; drop
;

: comp:
   >in @ : >in !
   ['] ?comp compile,
   postpone postpone
   0 postpone ; drop
   immediate
;

: setSafe
   begin
     SkipDelimiters 
     EndOfChunk 0=
   while
     dup execute
   repeat drop
;

: addr: ['] addr: setSafe ;
: comp: ['] comp: setSafe ;
: zero: ['] zero: setSafe ;

addr: ! @ 2! 2@ w! w@ off on
addr: rp! sp! 0!

zero: /  mod /mod sm/rem 
zero: w/ */mod */

comp: if then else begin until 
comp: again do loop ?do 
comp: while ." abort" ['] [char]
comp: i j leave unloop +loop 
comp: repeat recurse

warning on