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 AddOp( thunk : TThunk ): integer;
        procedure PushDat( x:integer );
        procedure PushRet( x:integer );
        procedure Pass;
        procedure GoSub;
        procedure Step;
        procedure Execute;
      end;
  
    TTokStr   = TStr;
  
    TWord	 = record
      // prev : address;
      word : TTokStr;
      code : address;
      data : cardinal
    end;
  
    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;
      public
        data, side : TImpStack;
        NeedsInput, HasOutput : boolean;
  
negative.code:       data := id;
      end;
      inc(numwds);
    end;
  
  procedure TImpForth.Mount( iden : TStr; imod : TImpModule );
    begin imod.name := u2a(iden); imod.imp := self; root.insertComponent(imod);
    end;
  
  procedure TImpForth.Mount( iden : TStr; cimod : CImpModule );
    begin Mount(iden, cimod.Create(nil));
    end;
  
  procedure TImpModule.SetImp( aImp : TImpForth );
    begin _imp := aImp; data := _imp.data; side := _imp.side; attach;
    end;
  
  function TImpForth.GetModule( iden : TStr ) : TImpModule;
    begin result := TImpModule(root.FindComponent(u2a(iden)))
    end;
  
  procedure TImpForth.Send( s : TStr );
  