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!!!