anchor.diff:  
   uses Math, Sysutils;
   
  +constructor TDrvParrot.create;
  +begin
  +  //FoutCode := TStringList.Create;
  +  //FoutData := TStringList.Create;
  +
  +  setlength(cache, 0);
  +  
  +  Parrot_srand(0);
  +  interp := Parrot_new(nil);
  +  out_pbc := create_string('');
  +
  +end;
  +
  +procedure TDrvParrot.execute(inNode: PParseNode);
  +var 
  +  hllcode: Parrot_PMC;
  +  pmc_result, pmc_tree: Parrot_PMC;
  +  s: string;
  +  oldExcpetionMask: TFPUExceptionMask;
  +begin
  +
  +  oldExcpetionMask := SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
  +
  +  pmc_tree := genTree(inNode);
  +  hllcode := Parrot_PMC_get_pmc_keyed_str(interp, pmc_tree, create_string('exec'));
  +  
  +  Parrot_ext_call(interp, hllcode, 'P->P', pmc_tree, @pmc_result);
  +  PCT(pmc_result);
  +  SetExceptionMask(oldExcpetionMask);
  +
  +end;
  +
  +procedure TDrvParrot.write(outStream: TFileStream);
  +var
  +  pbc: String;
  +begin
  +  pbc := Parrot_str_to_cstring(interp, out_pbc);
  +  outStream.write(pbc, length(pbc))
  +end;
  +
   function TDrvparrot.create_string(s: string): Parrot_String;
   begin
  -  //writeln('a');
     result := Parrot_new_string(interp, PChar(s), length(s), nil, 0);
  -  //writeln('b');
   end;
   
   function TDrvparrot.new_pmc(s: string): Parrot_PMC;
  
positive.code: begin
  
    // This should utilize a cache.
  
    //writeln('g');
  
    hll := Fgmr.settings.last('ParrotHLL');
    compiler := create_string('PIR');
  
negative.code: begin
    r := new_pmc('Hash');
  
    // exec
    Parrot_PMC_set_pmc_keyed_str(interp, r, create_string('exec'), genParrot(join(inNode.point.macros)) );
  
    // data
    data := new_pmc('ResizablePMCArray');
    if length(inNode.data) > 0 then
      for i := 0 to length(inNode.data)-1 do
      begin
        writeln(i);
        Parrot_PMC_push_string(interp, data, create_string(inNode.data[i]));
      end;
    Parrot_PMC_set_pmc_keyed_str(interp, r, create_string('data'), data );
  
    // children
  
    result := r;
  end;
  
  procedure TDrvParrot.PCT(inPast: Parrot_PMC);
  