anchor.diff:    TThunk    = procedure of object;
     TImpStack = GStack<variant>;
     TCmdQueue = TQueue<integer>;
  +  TTokStr   = TStr;
  +  TWord	 = record
  +    // prev : address;
  +    word : TTokStr;
  +    code : address;
  +    data : cardinal
  +  end;
    
     TInnerVM = class  (TComponent)
  
positive.code:       function Lookup  : boolean;
        function IsNumber : boolean;
        procedure NotFound;
      end;
  
  
negative.code:       function AddOp( thunk : TThunk ): integer;
        procedure PushDat( x:integer );
        procedure PushRet( x:integer );
        procedure Pass; procedure GoSub; procedure Step; procedure Execute;
    end;
  
    TImpForth = class; // forward declaration
    TImpModule = class (TComponent)
      protected
        _imp : TImpForth; data, side : TimpStack;
        procedure SetImp( aImp : TImpForth );
      public
        property imp : TImpForth read _imp write SetImp;
        procedure Attach; virtual; abstract;
      end;
    CImpModule = class of TImpModule;
  
  
    TImpForth = class (TComponent)
      protected
        vm  : TInnerVM; io : kvm.ITerm; tok : TTokStr;
        which : cardinal;    // address of last looked-up word
        // for now, we're just using a simple array for the dictionary
        words  : array[ 0 .. 1023 ] of TWord; numwds : cardinal;
        src : TStr; _model : uevt.TModel;
        root : TComponent;
      public
        data, side : TImpStack;
        NeedsInput, HasOutput : boolean;
  