Run the following program several times and see the result:

 

 

mapping special_attrs=([]);

 

void main()

{

         multiset from=(<>);

         array _to=({(<"Stone","1","%70">),(<"Stone","2","%70">)});

         multiset to;

         array rate=({});

         int sum;

 

         foreach(_to,multiset m){

                   int found;

                   foreach(m;string k;int one){

                            if(k[0]=='%'){

                                     int n;

                                     sscanf(k,"%%%d",n);

                                     rate+=({n});

                                     sum+=n;

                                     m[k]=0;

                                     found=1;

                                     break;

                            }

                   }

                   if(!found){

                            rate+=({1});

                            sum+=1;

                   }

         }

         int r=random(sum);

         for(int i=0;i<sizeof(rate);i++){

                   if(r<rate[i]){

                            to=_to[i];

                            break;

                   }else{

                            r-=rate[i];

                   }

         }

 

         multiset unchanged=from&to;

         multiset special_add=(to-unchanged)&(multiset)(indices(special_attrs));

         multiset special_del=(from-unchanged)&(multiset)(indices(special_attrs));

         multiset direct_del=filter(from-unchanged,lambda(string x){if(x[0]!='!') return 1;else return 0;});

         multiset direct_add=to-unchanged-special_add;

         werror("test4:%O %O\n",((array)direct_add),(direct_add));

 

}

 

 

 

C:\Documents and Settings\ibm\Desktop>pike t1.pike

test4:({ /* 1 element */

    "2"

}) (< /* 1 element */

  "Stone",

  "2"

>)

 

C:\Documents and Settings\ibm\Desktop>pike t1.pike

test4:({ /* 2 elements */

    "1",

    "Stone"

}) (< /* 2 elements */

  "1",

  "Stone"

>)

 

The red lines are important, (array)direct_add is not match up to direct_add!!!