reset forth
  : ( ') word sp@ ! sp@ ! ;

  : constant create , does> @ ;
  : variable create , ;

 -1 constant true
  0 constant false
  4 constant cell-size
  1 constant char-size

  : dup sp@ @ ;
  : drop sp@ ! ;
  : over sp@ cell-size + @ ;
  : pick cell-size * sp@ + @ ;
  : rot >r swap r> swap ;
  : -rot rot rot ;
  : nip swap drop ;
  : tuck swap over ;
  : 2dup over over ;
  : 2drop drop drop ;
  : negate -1 * ;

  : hex 16 base ! ;
  : decimal 10 base ! ;
  : binary 2 base ! ;
  : octal 8 base ! ;

  : here h @ ;

  : pad here 80 + ;
  : allot times 0 1, repeat allot ;
  : align 0 here cell-size mod allot ;
  : cell+ cell-size + ;
  : cells cell-size * ;
  : char+ char-size + ;
  : chars char-size * ;

  : /mod over over / rot rot mod ;
  : */ * / ;
  : */mod * /mod ;
  : not -1 * 1 - ;
  : abs dup 0 = if negate then ;

  : <> = not ;
  : > swap < ;
  : ?dup dup 0 = if ;; then dup ;
  : ?negate dup 0 < not if ;; then negate ;

  : min 2dup < if swap then drop ;
  : max 2dup > if swap then drop ;
  : within over - >r - r> < ;

  : off false swap ! ;
  : on true swap ! ;
  : +! swap over @ + swap ! ;
  : ++ 1 +! ;
  : -- -1 +! ;

  : array create cells allot does> swap cells + ;
  : stack: create cells dup here cell+ dup , + , allot ;
  : push 1 cells over +! @ ! ;
  : pop dup @ @ -1 cells rot +! ;

  : " '" word ;
  : count dup >r c@ r> char+ swap ;
  : place over over >r >r char+ swap cmove r> r> c! ;
  : copy$ >r count swap 1 - swap r> swap cmove ;
  : ' 32 word find ;
  : /string over min rot over + -rot - ;
  : .( ') word type ;

  : defined 32 word find ;
  : execute >r ;

  : depth sp0 sp@ - 4 - 4 / 1 - ; 
  : >body 5 - ;
  : c, here c! here 1 + h ! ;
  : bytes times c, repeat bytes ;
  : inline depth bytes ;
reset domain
