anchor.diff:  \ we inspect (currying and higher order functions would be nice).
   \ On the other hand, parsing is not what we do most, and especially
   \ not what will be time or power critical.
  -: BL-TEST  \ ( char delimiter -- flag )
  +: ?DELIM  \ ( char delimiter -- flag )
       DUP BL = IF 1+ < ELSE = THEN ;
   
   \ Parse ccc delimited by delimiter char.
  
positive.code: \ block for WORD.
  : PARSE  \ ( char "ccc<char>" -- c-addr u )                     ( core ext )
      0 SWAP    \ 0 counter if needed
      PARSE-DO
        I @ OVER BL-TEST
          IF DROP   I SOURCE DROP -   SWAP LEAVE THEN
      LOOP
      DROP  \ delimiter
      PARSE-POS SWAP DUP >IN +! ;
  
  \ Comments
  : (  41 PARSE DROP DROP ; IMMEDIATE
  
  \ Skip delimiter characters from the input stream.
  : SKIP  ( char "<chars>" -- )
      PARSE-DO
        I @ OVER BL-TEST 0= IF LEAVE THEN
        >IN 1+!
      LOOP
      DROP ( delimiter )
  
negative.code: : COMPILE,  ( xt -- )                                           ( core-ext )
      , ;
  
  : POSTPONE
      BL WORD FIND
      IF COMPILE, ELSE ABORT THEN
  ; IMMEDIATE
  
  : ?PAIRS  - IF ABORT" unmatched conditionals" THEN ;
  
  \ Conditionals
  : IF    HERE POSTPONE JUMP-FALSE 0 COMPILE, 2 ; IMMEDIATE
  : ELSE  2 ?PAIRS HERE POSTPONE JUMP 0 COMPILE, HERE ROT BACKPATCH 2 ; IMMEDIATE
  : THEN  2 ?PAIRS HERE SWAP BACKPATCH ; IMMEDIATE
  
  \ Loops
  : BACK     HERE COMPILE, ;  ( backward branch )
  : DO      POSTPONE (DO) HERE 3 ; IMMEDIATE
  : LOOP    3 ?PAIRS POSTPONE (LOOP)  POSTPONE JUMP-FALSE BACK ; IMMEDIATE
  : +LOOP   3 ?PAIRS COMPILE, POSTPONE (+LOOP) BACK ; IMMEDIATE
  
  
  
  
  