require ",

VARIABLE range-checking    TRUE range-checking !

: Unchecked-Array ( n -- )  
    CREATE CELLS ALLOT 
  DOES> ( n -- addr ) 
    SWAP CELLS + ;

: Checked-Array ( n -- )
   HERE  >IN @  BL WORD COUNT ",  >IN !  ( n c-addr )
   CREATE OVER , COUNT , , CELLS ALLOT
  DOES> ( n -- addr )
    range-checking @ IF
      >R  DUP R@ @ U< 0= 
      IF ." Index out of range in Array '" R@ CELL+ 2@ TYPE 
         ." '! Actual Index: " U. 
         ." Maximal Index: " R@ @ 1- U. ABORT 
      THEN
      R> 
    THEN
     3 CELLS + SWAP CELLS + ;

: Array ( n -- )  range-checking @ IF Checked-Array ELSE Unchecked-Array THEN ;

Tags: ANS-Forth data-structures safety bounds checking