Revamping associative arrays

dsimcha dsimcha at yahoo.com
Sat Oct 17 12:16:32 PDT 2009


== Quote from Andrei Alexandrescu (SeeWebsiteForEmail at erdani.org)'s article
> Associative arrays are today quite problematic because they don't offer
> any true iteration. Furthermore, the .keys and .values properties create
> new arrays, which is wasteful.
> Another issue with associative arrays is that ++a[k] is hacked, which
> reflects a grave language limitation. That needs to be replaced with a
> true facility.
> Any other issues with AAs that you want to see fixed, and ideas guiding
> a redesign?
> Thanks,
> Andrei

I've thought about this a lot, here's a laundry list.

1.  Huge AAs (over about 1 million elements) create massive amounts of false
pointers.  Whether this should be fixed in the AA design or whether the AA design
should assume a good GC design and hope we get one is a matter of debate.

2.  Every insertion to an AA requires a memory allocation (read:  requires taking
a lock in a multithreaded program).  Again, it's debatable whether an AA design
should consider this or whether the real answer is to fix the GC.

3.  The structure of AAs means that the GC must scan everything.  There is no part
of the data structure that can be marked as not having pointers, so that the GC
can skip scanning it.  This takes forever and a day.

4.  AAs are really, really, *really* space inefficient.  For *every element* in
the array, you have a struct that looks like the following:

struct aaA
{
    aaA *left;
    aaA *right;
    hash_t hash;
    /* key   */
    /* value */
}

Assuming 32-bit ints and pointers and zero overhead from other sources, this means
you have *at least* 12 bytes per element in wasted space.

5.  Everything in the current design is based on RTTI instead of templates.  I
haven't benchmarked this, but I'd imagine it has to slow things down a little.

6.  The array of aaA structs can only have the following sizes:

immutable size_t[] prime_list = [
              97UL,            389UL,
           1_543UL,          6_151UL,
          24_593UL,         98_317UL,
          393_241UL,      1_572_869UL,
        6_291_469UL,     25_165_843UL,
      100_663_319UL,    402_653_189UL,
    1_610_612_741UL,  4_294_967_291UL,
//  8_589_934_513UL, 17_179_869_143UL
];

I understand that there is theoretical justification for this, but in practice I'd
rather have O(N) performance in a few more corner cases in exchange for having my
AA not be horribly space-inefficient.


I've worked a little on a design that's based simply on two parallel arrays, one
for keys and one for values.  I used parallel arrays instead of structs to cut
down on alignment overhead and so that if one slot has ptrs and the other doesn't,
only the one that does can be scanned by the GC.  Collisions are resolved by
probing in an order defined by a linear congruential random number generator
seeded with the hash before computing the modulus.  This means that, even if two
elements have the same hash in modulus space, as long as their hashes are
different in full 32-bit space, the probing sequences for resolving collisions
will be completely different.  I might have mentioned it here a while back, but
I'll post it here for comment.  AFAIK it solves every one of the problems listed
above.
begin 644 LinAA2.d
M+RHJ06X at 87-S;V-I871I=F4 at 87)R87D@:6UP;&5M96YT871I;VX@=&AA="!U
M<V5S(')A;F1O;6EZ960@;&EN96%R(&-O;F=R=65N=&EA;`T*("H@<')O8FEN
M9R!F;W(@8V]L;&ES:6]N(')E<V]L=71I;VXN#0H@*@T*("H at 0GDZ("!$879I
M9"!3:6UC:&$-"B`J#0H@*B!,:6-E;G-E. at T*("H at 0F]O<W0 at 4V]F='=A<F4@
M3&EC96YS92`M(%9E<G-I;VX@,2XP("T at 075G=7-T(#$W=&@L(#(P,#,-"B`J
M#0H@*B!097)M:7-S:6]N(&ES(&AE<F5B>2!G<F%N=&5D+"!F<F5E(&]F(&-H
M87)G92P@=&\@86YY('!E<G-O;B!O<B!O<F=A;FEZ871I;VX-"B`J(&]B=&%I
M;FEN9R!A(&-O<'D@;V8@=&AE('-O9G1W87)E(&%N9"!A8V-O;7!A;GEI;F<@
M9&]C=6UE;G1A=&EO;B!C;W9E<F5D(&)Y#0H@*B!T:&ES(&QI8V5N<V4@*'1H
M92`B4V]F='=A<F4B*2!T;R!U<V4L(')E<')O9'5C92P at 9&ES<&QA>2P at 9&ES
M=')I8G5T92P-"B`J(&5X96-U=&4L(&%N9"!T<F%N<VUI="!T:&4 at 4V]F='=A
M<F4L(&%N9"!T;R!P<F5P87)E(&1E<FEV871I=F4@=V]R:W,@;V8@=&AE#0H@
M*B!3;V9T=V%R92P at 86YD('1O('!E<FUI="!T:&ER9"UP87)T:65S('1O('=H
M;VT@=&AE(%-O9G1W87)E(&ES(&9U<FYI<VAE9"!T;PT*("H at 9&\@<V\L(&%L
M;"!S=6)J96-T('1O('1H92!F;VQL;W=I;F<Z#0H@*@T*("H at 5&AE(&-O<'ER
M:6=H="!N;W1I8V5S(&EN('1H92!3;V9T=V%R92!A;F0@=&AI<R!E;G1I<F4@
M<W1A=&5M96YT+"!I;F-L=61I;F<-"B`J('1H92!A8F]V92!L:6-E;G-E(&=R
M86YT+"!T:&ES(')E<W1R:6-T:6]N(&%N9"!T:&4 at 9F]L;&]W:6YG(&1I<V-L
M86EM97(L#0H@*B!M=7-T(&)E(&EN8VQU9&5D(&EN(&%L;"!C;W!I97,@;V8@
M=&AE(%-O9G1W87)E+"!I;B!W:&]L92!O<B!I;B!P87)T+"!A;F0-"B`J(&%L
M;"!D97)I=F%T:79E('=O<FMS(&]F('1H92!3;V9T=V%R92P@=6YL97-S('-U
M8V@@8V]P:65S(&]R(&1E<FEV871I=F4-"B`J('=O<FMS(&%R92!S;VQE;'D@
M:6X@=&AE(&9O<FT@;V8@;6%C:&EN92UE>&5C=71A8FQE(&]B:F5C="!C;V1E
M(&=E;F5R871E9"!B>0T*("H at 82!S;W5R8V4@;&%N9W5A9V4@<')O8V5S<V]R
M+ at T*("H-"B`J(%1(12!33T945T%212!)4R!04D]6241%1"`B05, at 25,B+"!7
M251(3U54(%=!4E)!3E19($]&($%.62!+24Y$+"!%6%!215-3($]2#0H@*B!)
M35!,245$+"!)3D-,541)3D<@0E54($Y/5"!,24U)5$5$(%1/(%1(12!705)2
M04Y42453($]&($U%4D-(04Y404))3$E462P-"B`J($9)5$Y%4U, at 1D]2($$@
M4$%25$E#54Q!4B!055)03U-%+"!4251,12!!3D0 at 3D].+4E.1E))3D=%345.
M5"X at 24X@3D\@159%3E0-"B`J(%-(04Q,(%1(12!#3U!94DE'2%0 at 2$],1$52
M4R!/4B!!3EE/3D4 at 1$E35%))0E5424Y'(%1(12!33T945T%212!"12!,24%"
M3$4-"B`J($9/4B!!3ED at 1$%-04=%4R!/4B!/5$A%4B!,24%"24Q)5%DL(%=(
M151(15(@24X at 0T].5%)!0U0L(%1/4E0 at 3U(@3U1(15)725-%+`T*("H at 05))
M4TE.1R!&4D]-+"!/550 at 3T8@3U(@24X at 0T].3D5#5$E/3B!7251((%1(12!3
M3T945T%212!/4B!42$4 at 55-%($]2($]42$52#0H@*B!$14%,24Y'4R!)3B!4
M2$4 at 4T]&5%=!4D4N#0H@*B\-"@T*:6UP;W)T('-T9"YT<F%I=',L(&-O<F4N
M;65M;W)Y+"!S=&0N:6YT<FEN<VEC+"!C;W)E+F5X8V5P=&EO;BP@<W1D+F%L
M9V]R:71H;2P-"B`@("!S=&0N8V]N=CL-"@T*8VQA<W, at 2V5Y17)R;W(@.B!%
M>&-E<'1I;VX@>PT*("`@('1H:7,H<W1R:6YG(&US9RD@>PT*("`@("`@("!S
M=7!E<B at B2V5Y(&5R<F]R(BD[#0H@("`@?0T*?0T*#0IP<FEV871E(&5N=6T@
M.B!U:6YT('L-"B`@("!%35!462P-"B`@("!54T5$+`T*("`@(%)%34]6140-
M"GT-"@T*<W1R=6-T($ME>59A;%)A;F=E*$LL(%8L(&)O;VP@<W1O<F5(87-H
M+"!B;V]L('9A;',I('L-"G!R:79A=&4Z#0H@("`@<W1A=&EC(&EF*'9A;',I
M('L-"B`@("`@("`@86QI87, at 5B!4.PT*("`@('T at 96QS92![#0H@("`@("`@
M(&%L:6%S($L at 5#L-"B`@("!]#0H@("`@<VEZ95]T(&EN9&5X(#T@,#L-"B`@
M("!087)A;&QE;$%!(2A++"!6+"!S=&]R94AA<V at I(&%A.PT*<'5B;&EC. at T*
M("`@('1H:7,H4&%R86QL96Q!02$H2RP at 5BP@<W1O<F5(87-H*2!A82D@>PT*
M("`@("`@("!T:&ES+F%A(#T at 86$[#0H@("`@("`@('=H:6QE*&%A+F9L86=S
M6VEN9&5X72`A/2!54T5$("8F(&EN9&5X(#P at 86$N<W!A8V4I('L-"B`@("`@
M("`@("`@(&EN9&5X*RL[#0H@("`@("`@('T-"B`@("!]#0H-"B`@("!4(&9R
M;VYT*"D@>PT*("`@("`@("!S=&%T:6,@:68H=F%L<RD@>PT*("`@("`@("`@
M("`@<F5T=7)N(&%A+G9A;'-;:6YD97A=.PT*("`@("`@("!](&5L<V4@>PT*
M("`@("`@("`@("`@<F5T=7)N(&%A+E]K97ES6VEN9&5X73L-"B`@("`@("`@
M?0T*("`@('T-"@T*("`@('9O:60@<&]P1G)O;G0H*2![#0H@("`@("`@(&EN
M9&5X*RL[#0H@("`@("`@('=H:6QE*&%A+F9L86=S6VEN9&5X72`A/2!54T5$
M("8F(&EN9&5X(#P at 86$N<W!A8V4I('L-"B`@("`@("`@("`@(&EN9&5X*RL[
M#0H@("`@("`@('T-"B`@("!]#0H-"B`@("!B;V]L(&5M<'1Y*"D@>PT*("`@
M("`@("!R971U<FX@:6YD97@@/3T at 86$N<W!A8V4[#0H@("`@?0T*?0T*#0HO
M+R!)="=S(&9A<W1E<B!T;R!S=&]R92!T:&4@:&%S:"!I9B!I="=S(&5X<&5N
M<VEV92!T;R!C;VUP=71E+"!B=70-"B\O(&9A<W1E<B!N;W0@=&\@:68@:70G
M<R!C:&5A<"!T;R!C;VUP=71E+ at T*<')I=F%T92!T96UP;&%T92!S:&]U;&13
M=&]R94AA<V at H2RD@>PT*("`@(&5N=6T at 8F]O;"!S:&]U;&13=&]R94AA<V@@
M/2`A:7-&;&]A=&EN9U!O:6YT(4L@)B8@(6ES26YT96=R86PA2SL-"GT-"@T*
M9FEN86P at 8VQA<W, at 4&%R86QL96Q!02A++"!6+"!B;V]L('-T;W)E2&%S:"`]
M('-H;W5L9%-T;W)E2&%S:"$H2RDI('L-"G!R:79A=&4Z#0H@("`@2RH at 7VME
M>7,[#0H@("`@5BH@=F%L<SL-"B`@("!U8GET92H at 9FQA9W,[#0H-"B`@("!S
M=&%T:6,@:68H<W1O<F5(87-H*2![#0H@("`@("`@(&AA<VA?="H@:&%S:&5S
M.R`@+R\@1F]R(&9A<W0@<F5I;F1E>&EN9RX-"B`@("!]#0H-"B`@("!S:7IE
M7W0 at 7VQE;F=T:#L@("\O($QO9VEC86P@<VEZ90T*("`@('-I>F5?="!S<&%C
M93L@("\O(%-T;W)A9V4@<W!A8V4-"B`@("!S:7IE7W0@;D1E860[("`O+R!.
M=6UB97(@;V8 at 96QE;65N=',@<F5M;W9E9"X-"@T*("`@("\O($=O;V0@=F%L
M=65S(&9O<B!A(&QI;F5A<B!C;VYG<G5E;G1I86P@<F%N9&]M(&YU;6)E<B!G
M96XN#0H@("`@96YU;2!M=6P@/2`T.#(W,54[#0H@("`@96YU;2!M;V0@/2`R
M,30W-#@S-C0W53L-"@T*("`@(&AA<VA?="!G971(87-H*$L@:V5Y*2!C;VYS
M="![#0H@("`@("`@('-T871I8R!I9BAI<RA+(#H@;&]N9RD@)B8 at 2RYS:7IE
M;V8@/#T@:&%S:%]T+G-I>F5O9BD@>PT*("`@("`@("`@("`@:&%S:%]T(&AA
M<V@@/2!C87-T*&AA<VA?="D@:V5Y.PT*("`@("`@("!](&5L<V4@<W1A=&EC
M(&EF*&ES*'1Y<&5O9BAK97DN=&](87-H*"DI*2D@>PT*("`@("`@("`@("`@
M:&%S:%]T(&AA<V@@/2!K97DN=&](87-H*"D[#0H@("`@("`@('T at 96QS92![
M#0H@("`@("`@("`@("!H87-H7W0@:&%S:"`]('1Y<&5I9"A+*2YG971(87-H
M*"9K97DI.PT*("`@("`@("!]#0H-"B`@("`@("`@<F5T=7)N(&AA<V@[#0H@
M("`@?0T*#0H@("`@<VEZ95]T(&9I;F1&;W));G-E<G0H2R!K97DI('L-"B`@
M("`@("`@875T;R!H87-H1G5L;"`](&=E=$AA<V at H:V5Y*3L-"B`@("`@("`@
M<F5T=7)N(&9I;F1&;W));G-E<G0H:V5Y+"!H87-H1G5L;"D[#0H@("`@?0T*
M#0H@("`@<W1A=&EC(&EF*'-T;W)E2&%S:"D@>PT*("`@("`@("!S:7IE7W0@
M9FEN9$5X:7-T:6YG*$L@:V5Y*2!C;VYS="![#0H@("`@("`@("`@("!I;6UU
M=&%B;&4@:&%S:$9U;&P@/2!G971(87-H*&ME>2D[#0H@("`@("`@("`@("!S
M:7IE7W0@<&]S(#T@(&AA<VA&=6QL("4@<W!A8V4[#0H@("`@("`@("`@("!S
M:7IE7W0@<F%N9"`](&AA<VA&=6QL("L@,3L-"@T*("`@("`@("`@("`@=6EN
M="!F;&%G(#T@=F]I9#L-"B`@("`@("`@("`@('=H:6QE*'1R=64I('L-"B`@
M("`@("`@("`@("`@("!F;&%G(#T at 9FQA9W-;<&]S73L-"B`@("`@("`@("`@
M("`@("!I9B at H:&%S:$9U;&P@/3T@:&%S:&5S6W!O<UT@)B8@:V5Y(#T](%]K
M97ES6W!O<UT@)B8 at 9FQA9R`A/2!%35!462D-"B`@("`@("`@("`@("`@("`@
M("!\?"!F;&%G(#T]($5-4%19*2![#0H@("`@("`@("`@("`@("`@("`@(&)R
M96%K.PT*("`@("`@("`@("`@("`@('T-"@T*("`@("`@("`@("`@("`@(')A
M;F0@/2!C87-T*'-I>F5?="D@*&-A<W0H=6QO;F<I(')A;F0@*B!M=6P@)2!M
M;V0I.PT*("`@("`@("`@("`@("`@('!O<R`]("AR86YD("L@:&%S:$9U;&PI
M("4@<W!A8V4[#0H@("`@("`@("`@("!]#0H@("`@("`@("`@("!R971U<FX@
M9FQA9R`]/2!54T5$(#\@<&]S(#H@<VEZ95]T+FUA>#L-"B`@("`@("`@?0T*
M#0H@("`@("`@('-I>F5?="!F:6YD1F]R26YS97)T*$L@:V5Y+"!I;6UU=&%B
M;&4@:&%S:%]T(&AA<VA&=6QL*2![#0H@("`@("`@("`@("!S:7IE7W0@<&]S
M(#T@:&%S:$9U;&P@)2!S<&%C93L-"B`@("`@("`@("`@('-I>F5?="!R86YD
M(#T@:&%S:$9U;&P@*R`Q.PT*#0H@("`@("`@("`@("!W:&EL92AT<G5E*2![
M#0H@("`@("`@("`@("`@("`@:68H*&AA<VAE<UMP;W-=(#T](&AA<VA&=6QL
M("8F(%]K97ES6W!O<UT@/3T@:V5Y*2!\?`T*("`@("`@("`@("`@("`@("`@
M(&9L86=S6W!O<UT@(3T at 55-%1"D@>PT*("`@("`@("`@("`@("`@("`@("`@
M("!B<F5A:SL-"B`@("`@("`@("`@("`@("!]#0H@("`@("`@("`@("`@("`@
M<F%N9"`](&-A<W0H<VEZ95]T*2`H8V%S="AU;&]N9RD@<F%N9"`J(&UU;"`E
M(&UO9"D[#0H@("`@("`@("`@("`@("`@<&]S(#T@*')A;F0@*R!H87-H1G5L
M;"D@)2!S<&%C93L-"B`@("`@("`@("`@('T-"@T*("`@("`@("`@("`@:&%S
M:&5S6W!O<UT@/2!H87-H1G5L;#L-"B`@("`@("`@("`@(')E='5R;B!P;W,[
M#0H@("`@("`@('T-"B`@("!](&5L<V4@>PT*("`@("`@("!S:7IE7W0 at 9FEN
M9$5X:7-T:6YG*$L@:V5Y*2!C;VYS="![#0H@("`@("`@("`@("!I;6UU=&%B
M;&4@:&%S:$9U;&P@/2!G971(87-H*&ME>2D[#0H@("`@("`@("`@("!S:7IE
M7W0@<&]S(#T@(&AA<VA&=6QL("4@<W!A8V4[#0H@("`@("`@("`@("!S:7IE
M7W0@<F%N9"`](&AA<VA&=6QL("L@,3L-"@T*("`@("`@("`@("`@=6EN="!F
M;&%G(#T@=F]I9#L-"B`@("`@("`@("`@('=H:6QE*'1R=64I('L-"@T*("`@
M("`@("`@("`@("`@(&9L86<@/2!F;&%G<UMP;W-=.PT*("`@("`@("`@("`@
M("`@(&EF*"A?:V5Y<UMP;W-=(#T](&ME>2`F)B!F;&%G("$]($5-4%19*2!\
M?"!F;&%G(#T]($5-4%19*2![#0H@("`@("`@("`@("`@("`@("`@(&)R96%K
M.PT*("`@("`@("`@("`@("`@('T-"@T*("`@("`@("`@("`@("`@(')A;F0@
M/2!C87-T*'-I>F5?="D@*&-A<W0H=6QO;F<I(')A;F0@*B!M=6P@)2!M;V0I
M.PT*("`@("`@("`@("`@("`@('!O<R`]("AR86YD("L@:&%S:$9U;&PI("4@
M<W!A8V4[#0H@("`@("`@("`@("!]#0H@("`@("`@("`@("!R971U<FX at 9FQA
M9R`]/2!54T5$(#\@<&]S(#H@<VEZ95]T+FUA>#L-"B`@("`@("`@?0T*#0H@
M("`@("`@('-I>F5?="!F:6YD1F]R26YS97)T*$L@:V5Y+"!I;6UU=&%B;&4@
M:&%S:%]T(&AA<VA&=6QL*2![#0H@("`@("`@("`@("!S:7IE7W0@<&]S(#T@
M:&%S:$9U;&P@)2!S<&%C93L-"B`@("`@("`@("`@('-I>F5?="!R86YD(#T@
M:&%S:$9U;&P@*R`Q.PT*#0H@("`@("`@("`@("!W:&EL92AF;&%G<UMP;W-=
M(#T](%53140@)B8 at 7VME>7-;<&]S72`A/2!K97DI('L-"B`@("`@("`@("`@
M("`@("!R86YD(#T at 8V%S="AS:7IE7W0I("AC87-T*'5L;VYG*2!R86YD("H@
M;75L("4@;6]D*3L-"B`@("`@("`@("`@("`@("!P;W,@/2`H<F%N9"`K(&AA
M<VA&=6QL*2`E('-P86-E.PT*("`@("`@("`@("`@?0T*#0H@("`@("`@("`@
M("!R971U<FX@<&]S.PT*("`@("`@("!]#0H@("`@?0T*#0H@("`@=F]I9"!A
M<W-I9VY.;U)E:&%S:$-H96-K*$L@:V5Y+"!6('9A;"P@:&%S:%]T(&AA<VA&
M=6QL*2![#0H@("`@("`@('-I>F5?="!I(#T at 9FEN9$9O<DEN<V5R="AK97DL
M(&AA<VA&=6QL*3L-"B`@("`@("`@=F%L<UMI72`]('9A;#L-"B`@("`@("`@
M:6UM=71A8FQE('5I;G0 at 9FQA9R`](&9L86=S6VE=.PT*("`@("`@("!I9BAF
M;&%G("$](%53140I('L-"B`@("`@("`@("`@(&EF*&9L86<@/3T at 4D5-3U9%
M1"D@>PT*("`@("`@("`@("`@("`@(&Y$96%D+2T[#0H@("`@("`@("`@("!]
M#0H@("`@("`@("`@("!?;&5N9W1H*RL[#0H@("`@("`@("`@("!F;&%G<UMI
M72`](%53140[#0H@("`@("`@("`@("!?:V5Y<UMI72`](&ME>3L-"B`@("`@
M("`@?0T*("`@('T-"@T*("`@('9O:60 at 87-S:6=N3F]296AA<VA#:&5C:RA+
M(&ME>2P at 5B!V86PI('L-"B`@("`@("`@<VEZ95]T(&D@/2!F:6YD1F]R26YS
M97)T*&ME>2D[#0H@("`@("`@('9A;'-;:5T@/2!V86P[#0H@("`@("`@(&EM
M;75T86)L92!U:6YT(&9L86<@/2!F;&%G<UMI73L-"B`@("`@("`@:68H9FQA
M9R`A/2!54T5$*2![#0H@("`@("`@("`@("!I9BAF;&%G(#T](%)%34]6140I
M('L-"B`@("`@("`@("`@("`@("!N1&5A9"TM.PT*("`@("`@("`@("`@?0T*
M("`@("`@("`@("`@7VQE;F=T:"LK.PT*("`@("`@("`@("`@9FQA9W-;:5T@
M/2!54T5$.PT*("`@("`@("`@("`@7VME>7-;:5T@/2!K97D[#0H@("`@("`@
M('T-"B`@("!]#0H-"B`@("!V;VED(')E:&%S:$EF3F5C97-S87)Y*"D@>PT*
M("`@("`@("!I9BAC87-T*')E86PI("A?;&5N9W1H("L@;D1E860I("\@<W!A
M8V4@/"`P+C<I('L-"B`@("`@("`@("`@(')E='5R;CL-"B`@("`@("`@?0T*
M("`@("`@("!R97-E<G9E*'-P86-E("H@,BD[#0H@("`@?0T*#0H@("`@+R\@
M1'5M;7D at 8V]N<W1R=6-T;W(@;VYL>2!U<V5D(&EN=&5R;F%L;'DN#0H@("`@
M=&AI<RAB;V]L(&1U;6UY*2![?0T*#0IP=6)L:6,Z#0H-"B`@("!T:&ES*'-I
M>F5?="!I;FET4VEZ92`](#$P*2![#0H@("`@("`@("\O:6YI=%-I>F4@/2!N
M97AT4VEZ92AI;FET4VEZ92D[#0H@("`@("`@(%]K97ES(#T at 8V%S="A+*BD@
M1T,N;6%L;&]C*&EN:713:7IE("H at 2RYS:7IE;V8L#0H@("`@("`@("`@("`H
M='EP96ED*$LI+F9L86=S*2`_(&-A<W0H1T,N0FQK071T<BD@,"`Z#0H@("`@
M("`@("`@("!'0RY";&M!='1R+DY/7U-#04XI.PT*("`@("`@("!V86QS(#T@
M8V%S="A6*BD at 1T,N;6%L;&]C*&EN:713:7IE("H at 5BYS:7IE;V8L#0H@("`@
M("`@("`@("`H='EP96ED*%8I+F9L86=S*2`_(&-A<W0H1T,N0FQK071T<BD@
M,"`Z#0H@("`@("`@("`@("!'0RY";&M!='1R+DY/7U-#04XI.PT*#0H@("`@
M("`@('-T871I8R!I9BAS=&]R94AA<V at I('L-"B`@("`@("`@("`@(&AA<VAE
M<R`](&-A<W0H:&%S:%]T*BD-"B`@("`@("`@("`@("`@("`@("`@1T,N;6%L
M;&]C*&EN:713:7IE("H@:&%S:%]T+G-I>F5O9BP at 1T,N0FQK071T<BY.3U]3
M0T%.*3L-"B`@("`@("`@?0T*#0H@("`@("`@(&9L86=S(#T@*&YE=R!U8GET
M95MI;FET4VEZ95TI+G!T<CL-"B`@("`@("`@<W!A8V4@/2!I;FET4VEZ93L-
M"B`@("!]#0H-"B`@("`O+R\-"B`@("!V;VED(')E:&%S:"@I('L-"B`@("`@
M("`@<F5S97)V92AM87 at H,3`L(%]L96YG=&@@*B`R*2D[#0H@("`@?0T*#0H@
M("`@+R\O#0H@("`@=F]I9"!R97-E<G9E*'-I>F5?="!N97=3:7IE*2![#0H@
M("`@("`@('-C;W!E('1Y<&5O9BAT:&ES*2!N97=486)L92`](&YE=R!T>7!E
M;V8H=&AI<RDH;F5W4VEZ92D[#0H-"B`@("`@("`@=F5R<VEO;BAA;&PI('L-
M"B`@("`@("`@("`@('-T871I8R!I9BAS=&]R94AA<V at I('L-"B`@("`@("`@
M("`@("`@("!N97=486)L92YS<&%C92`](&UI;BA'0RYS:7IE3V8H;F5W5&%B
M;&4N7VME>7,I("\@2RYS:7IE;V8L#0H@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@1T,N<VEZ94]F*&YE=U1A8FQE+G9A;',I("\@5BYS
M:7IE;V8L#0H@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M1T,N<VEZ94]F*&YE=U1A8FQE+F9L86=S*2`O('5B>71E+G-I>F5O9BP-"B`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("!'0RYS:7IE3V8H
M;F5W5&%B;&4N:&%S:&5S*2`O(&AA<VA?="YS:7IE;V8I.PT*("`@("`@("`@
M("`@?2!E;'-E('L-"B`@("`@("`@("`@("`@("!N97=486)L92YS<&%C92`]
M(&UI;BA'0RYS:7IE3V8H;F5W5&%B;&4N7VME>7,I("\@2RYS:7IE;V8L#0H@
M("`@("`@("`@("`@("`@("`@("`@("`@1T,N<VEZ94]F*&YE=U1A8FQE+G9A
M;',I("\@5BYS:7IE;V8L#0H@("`@("`@("`@("`@("`@("`@("`@("`@1T,N
M<VEZ94]F*&YE=U1A8FQE+F9L86=S*2`O('5B>71E+G-I>F5O9BD[#0H@("`@
M("`@("`@("!]#0H@("`@("`@("`@("!N97=486)L92YF;&%G<ULP+BYN97=4
M86)L92YS<&%C95T@/2`P.PT*("`@("`@("!]#0H-"B`@("`@("`@9F]R96%C
M:"AI.R`P+BYS<&%C92D@>PT*("`@("`@("`@("`@:68H9FQA9W-;:5T@/3T@
M55-%1"D@>PT*("`@("`@("`@("`@("`@('-T871I8R!I9BAS=&]R94AA<V at I
M('L-"B`@("`@("`@("`@("`@("`@("`@;F5W5&%B;&4N87-S:6=N3F]296AA
M<VA#:&5C:RA?:V5Y<UMI72P@=F%L<UMI72P@:&%S:&5S6VE=*3L-"B`@("`@
M("`@("`@("`@("!](&5L<V4@>PT*("`@("`@("`@("`@("`@("`@("!N97=4
M86)L92YA<W-I9VY.;U)E:&%S:$-H96-K*%]K97ES6VE=+"!V86QS6VE=*3L-
M"B`@("`@("`@("`@("`@("!]#0H@("`@("`@("`@("!]#0H@("`@("`@('T-
M"@T*("`@("`@("!T:&ES+F9R964H*3L-"@T*("`@("`@("!F;W)E86-H*'1I
M+"!E;&5M.R!N97=486)L92YT=7!L96]F*2![#0H@("`@("`@("`@("!T:&ES
M+G1U<&QE;V9;=&E=(#T at 96QE;3L-"B`@("`@("`@?0T*("`@('T-"@T*("`@
M("\O+PT*("`@(')E9B!6(&]P26YD97 at H2R!I;F1E>"D@>PT*("`@("`@("!S
M:7IE7W0@:2`](&9I;F1%>&ES=&EN9RAI;F1E>"D[#0H@("`@("`@(&EF*&D@
M/3T@<VEZ95]T+FUA>"D@>PT*("`@("`@("`@("`@=&AR;W<@;F5W($ME>45R
M<F]R*")#;W5L9"!N;W0 at 9FEN9"!K97D@(B!^('1O(7-T<FEN9RAI;F1E>"DI
M.PT*("`@("`@("!](&5L<V4@>PT*("`@("`@("`@("`@<F5T=7)N('9A;'-;
M:5T[#0H@("`@("`@('T-"B`@("!]#0H-"B`@("`O+R\-"B`@("!6(&]P26YD
M97 at H2R!I;F1E>"D at 8V]N<W0@>PT*("`@("`@("!S:7IE7W0@:2`](&9I;F1%
M>&ES=&EN9RAI;F1E>"D[#0H@("`@("`@(&EF*&D@/3T@<VEZ95]T+FUA>"D@
M>PT*("`@("`@("`@("`@=&AR;W<@;F5W($ME>45R<F]R*")#;W5L9"!N;W0@
M9FEN9"!K97D@(B!^('1O(7-T<FEN9RAI;F1E>"DI.PT*("`@("`@("!](&5L
M<V4@>PT*("`@("`@("`@("`@<F5T=7)N('9A;'-;:5T[#0H@("`@("`@('T-
M"B`@("!]#0H-"B`@("`O+R\-"B`@("!V;VED(&]P26YD97A!<W-I9VXH5B!V
M86PL($L@:6YD97 at I('L-"B`@("`@("`@87-S:6=N3F]296AA<VA#:&5C:RAI
M;F1E>"P@=F%L*3L-"B`@("`@("`@<F5H87-H269.96-E<W-A<GDH*3L-"B`@
M("!]#0H-"B`@("`O+R\-"B`@("!+97E686Q286YG92$H2RP at 5BP@<W1O<F5(
M87-H+"!F86QS92D@:V5Y<R at I('L-"B`@("`@("`@<F5T=7)N($ME>59A;%)A
M;F=E(2A++"!6+"!S=&]R94AA<V at L(&9A;'-E*2AT:&ES*3L-"B`@("!]#0H-
M"B`@("`O+R\-"B`@("!+97E686Q286YG92$H2RP at 5BP@<W1O<F5(87-H+"!T
M<G5E*2!V86QU97,H*2![#0H@("`@("`@(')E='5R;B!+97E686Q286YG92$H
M2RP at 5BP@<W1O<F5(87-H+"!T<G5E*2AT:&ES*3L-"B`@("!]#0H-"B`@("`O
M+R\-"B`@("!6(')E;6]V92A+(&EN9&5X*2![#0H@("`@("`@('-I>F5?="!I
M(#T at 9FEN9$5X:7-T:6YG*&EN9&5X*3L-"B`@("`@("`@:68H:2`]/2!S:7IE
M7W0N;6%X*2![#0H@("`@("`@("`@("!T:')O=R!N97<@2V5Y17)R;W(H(D-O
M=6QD(&YO="!F:6YD(&ME>2`B('X@=&\A<W1R:6YG*&EN9&5X*2D[#0H@("`@
M("`@('T at 96QS92![#0H@("`@("`@("`@("!?;&5N9W1H+2T[#0H@("`@("`@
M("`@("!N1&5A9"LK.PT*("`@("`@("`@("`@9FQA9W-;:5T@/2!214U/5D5$
M.PT*("`@("`@("`@("`@<F5T=7)N('9A;'-;:5T[#0H@("`@("`@('T-"B`@
M("!]#0H-"B`@("`O+R\-"B`@("!6*B!O<$EN7W(H2R!I;F1E>"D@>PT*("`@
M("`@("!S:7IE7W0@:2`](&9I;F1%>&ES=&EN9RAI;F1E>"D[#0H@("`@("`@
M(&EF*&D@/3T@<VEZ95]T+FUA>"D@>PT*("`@("`@("`@("`@<F5T=7)N(&YU
M;&P[#0H@("`@("`@('T at 96QS92![#0H@("`@("`@("`@("!R971U<FX@=F%L
M<R`K(&D[#0H@("`@("`@('T-"B`@("!]#0H-"B`@("`O*BI!;&QO=W, at 9F]R
M(&1E;&5T:6YG('1H92!C;VYT96YT<R!O9B!T:&4 at 87)R87D@;6%N=6%L;'DL
M(&EF('-U<'!O<G1E9`T*("`@("`J(&)Y('1H92!'0RXJ+PT*("`@('9O:60@
M9G)E92 at I('L-"B`@("`@("`@1T,N9G)E92@@8V%S="AV;VED*BD@=&AI<RY?
M:V5Y<RD[#0H@("`@("`@($=#+F9R964H(&-A<W0H=F]I9"HI('1H:7,N=F%L
M<RD[#0H@("`@("`@($=#+F9R964H(&-A<W0H=F]I9"HI('1H:7,N9FQA9W,I
M.PT*#0H@("`@("`@('-T871I8R!I9BAS=&]R94AA<V at I('L-"B`@("`@("`@
M("`@($=#+F9R964H(&-A<W0H=F]I9"HI('1H:7,N:&%S:&5S("D[#0H@("`@
M("`@('T-"B`@("!]#0H-"B`@("`O+R\-"B`@("!S:7IE7W0@;&5N9W1H*"D@
M>PT*("`@("`@("!R971U<FX at 7VQE;F=T:#L-"B`@("!]#0I]#0H-"FEM<&]R
M="!S=&0N<F%N9&]M+"!S=&0N8V]N=')A8W1S+"!S=&0N<W1D:6\[#0H-"B\O
M(%1E<W0@:70@;W5T+ at T*=F]I9"!M86EN*"D@>PT*#0H@("`@<W1A=&EC('-T
M<FEN9R!R86YD4W1R:6YG*')E86P at 97AP96-T961,96YG=&@I('L-"B`@("`@
M("`@<W1R:6YG(')E=#L-"B`@("`@("`@<F5A;"!C=71O9F8@/2`Q+C!,("\@
M97AP96-T961,96YG=&@[#0H@("`@("`@(')E86P@<F%N9$YU;2`]('5N:69O
M<FTH,"XP3"P@,2XP3"D[#0H-"B`@("`@("`@=VAI;&4H<F%N9$YU;2`^(&-U
M=&]F9BD@>PT*("`@("`@("`@("`@<F5T('X]('5N:69O<FTA(EM=(B at G82<L
M("=Z)RD[#0H@("`@("`@("`@("!R86YD3G5M(#T@=6YI9F]R;2 at P+C!,+"`Q
M+C!,*3L-"B`@("`@("`@?0T*#0H@("`@("`@(')E='5R;B!R970[#0H@("`@
M?0T*#0H-"B`@("!S=')I;F=;<W1R:6YG72!B=6EL=&EN.PT*("`@(&%U=&\@
M;7E!02`](&YE=R!087)A;&QE;$%!(2AS=')I;F<L('-T<FEN9RDH*3L-"@T*
M("`@(&9O<F5A8V at H:3L@,"XN,3`P7S`P,"D@>PT*("`@("`@("!A=71O(&UY
M2V5Y(#T@<F%N9%-T<FEN9R at R,"D[#0H@("`@("`@(&%U=&\@;7E686P@/2!R
M86YD4W1R:6YG*#(P*3L-"B`@("`@("`@8G5I;'1I;EMM>4ME>5T@/2!M>59A
M;#L-"B`@("`@("`@;7E!05MM>4ME>5T@/2!M>59A;#L-"B`@("!]#0H-"B`@
M("!E;F9O<F-E*&UY04$N;&5N9W1H(#T](&)U:6QT:6XN;&5N9W1H*3L-"B`@
M("!F;W)E86-H*&ME>3L@;7E!02YK97ES*2![#0H@("`@("`@(&5N9F]R8V4H
M;7E!05MK97E=(#T](&)U:6QT:6Y;:V5Y72D[#0H@("`@?0T*#0H@("`@875T
M;R!K97ES(#T at 8G5I;'1I;BYK97ES.PT*("`@(')A;F1O;5-H=69F;&4H:V5Y
M<RD[#0H@("`@9F]R96%C:"AT;U)E;6]V93L@:V5Y<ULP+BXQ,#`P72D@>PT*
M("`@("`@("!B=6EL=&EN+G)E;6]V92AT;U)E;6]V92D[#0H@("`@("`@(&UY
M04$N<F5M;W9E*'1O4F5M;W9E*3L-"B`@("!]#0H-"@T*("`@(&UY04$N<F5H
M87-H*"D[#0H@("`@96YF;W)C92AM>4%!+FQE;F=T:"`]/2!B=6EL=&EN+FQE
M;F=T:"D[#0H@("`@9F]R96%C:"AK+"!V.R!B=6EL=&EN*2![#0H@("`@("`@
M(&5N9F]R8V4H:R!I;B!M>4%!*3L-"B`@("`@("`@96YF;W)C92@@*BAK(&EN
M(&UY04$I(#T]('8I.PT*("`@('T-"@T*("`@('-T<FEN9UM=(&UY5F%L=65S
M.PT*("`@(&9O<F5A8V at H=F%L.R!M>4%!+G9A;'5E<RD@>PT*("`@("`@("!M
M>59A;'5E<R!^/2!V86P[#0H@("`@?0T*#0H@("`@<W1R:6YG6UT@;7E+97ES
M.PT*("`@(&9O<F5A8V at H:V5Y.R!M>4%!+FME>7,I('L-"B`@("`@("`@;7E+
M97ES('X](&ME>3L-"B`@("!]#0H-"B`@("!A=71O(&)U:6QT:6Y+97ES(#T@
M8G5I;'1I;BYK97ES.PT*("`@(&%U=&\@8G5I;'1I;E9A;',@/2!B=6EL=&EN
M+G9A;'5E<SL-"B`@("!S;W)T*&)U:6QT:6Y686QS*3L-"B`@("!S;W)T*&)U
M:6QT:6Y+97ES*3L-"B`@("!S;W)T*&UY2V5Y<RD[#0H@("`@<V]R="AM>59A
M;'5E<RD[#0H@("`@96YF;W)C92AM>4ME>7,@/3T at 8G5I;'1I;DME>7,I.PT*
M("`@(&5N9F]R8V4H;7E686QU97,@/3T at 8G5I;'1I;E9A;',I.PT*#0H@("`@
B=W)I=&5L;B at B4&%S<V5D(&%L;"!T97-T<RXB*3L-"GT-"@``
`
end



More information about the Digitalmars-d mailing list