digitalmars.D - Multimethod library - mml.d
- nail (368/368) Feb 08 2005 I know some time ago 'pragma' wrote multimethods lib, I used it but unfo...
- Craig Black (4/16) Feb 08 2005 I agree, multimethods are a very useful and powerful language feature. ...
- Norbert Nemec (11/22) Feb 09 2005 I have no experience with using multimethods. Looking at your
- nail (9/19) Feb 09 2005 First - dispatch table will be built at compile time. Second - compiler ...
- Craig Black (12/35) Feb 09 2005 You have no experience using multimethods, so how can you make such a ra...
- Norbert Nemec (25/38) Feb 10 2005 OK, sorry - I have rather strict criteria when talking about 'efficient'...
- nail (49/87) Feb 10 2005 The best method for multi-dispatching I seen is multi-row
- Craig Black (27/37) Feb 10 2005 I am currently developing a simulation engine for DoD modeling and
- Mark Junker (4/7) Feb 09 2005 What are multimethods?
- nail (13/14) Feb 09 2005 Realization of so called late type binding. So if you have
- Craig Black (24/25) Feb 09 2005 Virtual methods could be considered to be a special case of multimethod....
I know some time ago 'pragma' wrote multimethods lib, I used it but unfortunatly found that it has bugs, has no feature to implicitly choose the best suitable signature and not always was typesafe. So I wrote my own, It supports unary and binary multimethods, and has no mentioned drawbacks. P.S: And nevertheless, I would very very happy if D begun to support mmethods natively. nail-mail <at> mail <dot> ru begin 0644 mml.d M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+PHO+PHO+R!- M34P *&UU;'1I+6UE=&AO9"!L:6)R87)Y*2!I<R!I;7!L96UE;G1A=&EO;B!O M9B!M=6QT:6UE=&AO9"!D:7-P871C:&EN9R!F;W(*+R\ 1"!,86YG=6%G90HO M86MO<GEA:V]V("AN86EL+6UA:6Q`;6%I;"YR=2D*+R\*+R\ 5&AI<R!P<F]G M<F%M(&ES(&9R964 <V]F='=A<F4[('EO=2!C86X <F5D:7-T<FEB=71E(&ET M(&%N9"]O<B!M;V1I9GD :70 =6YD97(*+R\ =&AE('1E<FUS(&]F('1H92!' M3E4 3&5S<V5R($=E;F5R86P ($QI8V5N<V4 87, <'5B;&ES:&5D(&)Y('1H M92!&<F5E(%-O9G1W87)E"B\O($9O=6YD871I;VX[(&5I=&AE<B!V97)S:6]N M=&5R"B\O('9E<G-I;VXN"B\O"B\O(%1H:7, <')O9W)A;2!I<R!D:7-T<FEB M=71E9"!I;B!T:&4 :&]P92!T:&%T(&ET('=I;&P 8F4 =7-E9G5L+"!B=70 M5TE42$]55`HO+R!!3ED 5T%24D%.5%D[('=I=&AO=70 979E;B!T:&4 :6UP M+R!&3U( 02!005)424-53$%2(%!54E!/4T4N(%-E92!T:&4 1TY5($QE<W-E M<B!'96YE<F%L("!,:6-E;G-E(&9O<B!M;W)E(&1E=&%I;',N"B\O"B\O(%EO M=2!S:&]U;&0 :&%V92!R96-E:79E9"!A(&-O<'D ;V8 =&AE($=.52!,97-S M97( 1V5N97)A;"` 3&EC96YS92!A;&]N9R!W:71H"B\O('1H:7, <')O9W)A M;3L :68 ;F]T+"!W<FET92!T;R!T:&4 1G)E92!3;V9T=V%R92!&;W5N9&%T M:6]N+"!);F,N+"`U.2!496UP;&4*+R\ 4&QA8V4 +2!3=6ET92`S,S`L($)O M=W=W+F=N=2YO<F<O8V]P>6QE9G0O;&5S<V5R+G1X="X*+R\*+R\O+R\O+R\O M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O M+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+PH*;6]D=6QE(&UM;"YM;6P[ M"71H:7,H8VAA<EM=(&US9RD*"7L*"0ES=7!E<B B06UB:6=U;W5S(&9U;F-T M:6]N(&-A;&PN("( ?B!M<V<I.PH)?0I]" HO*BH*("H 0VQA<W, 9F]R(&)E M:&%V:6]U<B!M971H;V1S('=I=& ;VYE(&%R9W5M96YT"B`J+PIC;&%S<R!5 M;F%R>4UU;'1I;65T:&]D*%)4*0I[" DO*BH*"2`J($EN=&5R9F%C92!R97!R M97-E;G1S(&1E;&5G871E(&UE=&AO9"!F;W( 9&ES<&%T8V =&%B;&4*"2`J M+PH)<')I=F%T92!I;G1E<F9A8V4 06)S=')A8W1$96QE9V%T90H)>PH)"7!R M8FQI8R!25"!O<$-A;&PH3V)J96-T(&%R9RD[" E]" D*"2\J* H)("H 0VQA M<W, <F5P<F5S96YT<R!D96QE9V%T92!M971H;V0 9F]R(&1I<W!A=&-H('1A M8FQE('=I=& 9&5F:6YE9"!A<F=U;65N="!T>7!E<PH)("HO" EP=6)L:6, M8VQA<W, 1&5L96=A=&4H5"D .B!!8G-T<F%C=$1E;&5G871E" E[" D)<')I M=F%T92!25"!D96QE9V%T92A4*2!D9SL*"0D*"0ET:&ES*%)4(&1E;&5G871E M*%0I(&1G*0H)"7L*"0D)87-S97)T*&1G*3L*"0D)=&AI<RYD9R`](&1G.PH) M"7T*"0D*"0E25"!O<$-A;&PH5"!X*0H)"7L*"0D)<F5T=7)N(&1G*' I.PH) M"7T*"0D*"0EP<F]T96-T960 0VQA<W-);F9O(&%R9W5M96YT0VQA<W-);F9O M*"D*"0E[" D)"7)E='5R;B!4+F-L87-S:6YF;SL*"0E]" D)" D)<'5B;&EC M(%)4(&]P0V%L;"A/8FIE8W0 87)G*0H)"7L*"0D)<F5T=7)N(&1G*&-A<W0H M5"EA<F<I.PH)"7T*"7T*"0H)+RHJ" D ("H 0F5H879I;W5R(&ES(&$ 8V]L M;&5C=&EO;B!O9B!M971H;V1S('=H:71H:6X =VEC:"!A(&)E<W0 :7, <V5L M96-T960 9F]R" D ("H :6YV;VMI;F< 869T97( 87)G=6UE;G1S(&1I<W!A M=&-H" D ("HO" EP=6)L:6, 8VQA<W, 0F5H879I;W5R" E[" D)<'5B;&EC M9RD*"0D)>PH)"0D)+R\ 07-S:6=N(&EN9&5X('1O(&$ 8VQA<W, :68 :70 M9&]E<R!N;W0 86QR96%D>2!R96=I<W1E<F5D" D)"0EV;VED(')E9VES=&5R M0VQA<W,H0VQA<W-);F9O(&-I*0H)"0D)>PH)"0D)"6EF("AC:2!I;B!C;&%S M<TEN9&5X*0H)"0D)"0ER971U<FX[" D)"0D)"0H)"0D)"6-L87-S26YD97A; M<TEN9F\ 8VD[" D)"0EC:2`](&1G+F%R9W5M96YT0VQA<W-);F9O*"D[" D) M"0D*"0D)"2\O(&EF(&-L87-S(&ES('5S960 9F]R(&$ 9FER<W0 =&EM92!G M:79E(&ET(&%N(&EN9&5X" D)"0ER96=I<W1E<D-L87-S*&-I*3L*"0D)"0H) M"0D)+R\ 9V5T(&EN9&5X" D)"0EU:6YT(&ED>#L*"0D)"6ED>"`](&-L87-S M26YD97A;(&-I(%T[" D)"0D*"0D)"6EF("AI9' /CT ;65T:&]D<RYL96YG M=& I" D)"0D)97AP86YD5&%B;&4H*3L*"0D)"0H)"0D);65T:&]D<UL :61X M(%T /2!D9SL*"0D)"0H)"0D)<F5T=7)N('1H:7,[" D)"7T*"0H)"7!U8FQI M8SH +R\ 5$]$3SH ;6%K92!P<FEV871E(&%F=&5R(&-O;7!I;&5R(&)U9V9I M>`H)"0DO+R!&:7)S="!I;F1E>"!I<R!F:7)S="!A<F=U;65N="!C;&%S<R!I M;F1E>"P <VEM:6QI87( 9F]R('-E8V]N9`H)"0E!8G-T<F%C=$1E;&5G871E M6UT ;65T:&]D<SL*"0D)" D)"75I;G0 ;F5X=$-L87-S26YD97 /2`P.PH) M"0EU:6YT(&-L87-S26YD97A;($-L87-S26YF;R!=.PH)"0D*"0EP=6)L:6,Z M("\O(%1/1$\Z(&UA:V4 <')I=F%T92!A9G1E<B!C;VUP:6QE<B!B=6=F:7 * M"0D)+R\ 9'5P;&EC871E('1A8FQE(&EN(&5A8V 9&EM96YS:6]N" D)"79O M:60 97AP86YD5&%B;&4H*0H)"0E[" D)"0EU:6YT(&1I;2`](&UE=&AO9',N M;&5N9W1H("H ,CL*"0D)"0H)"0D)+R\ :68 =&%B;&4 =V%S(&YU;&P <VEZ M"0D)"0ED:6T /2`T.PH)"0D)"0H)"0D);65T:&]D<RYL96YG=& /2!D:6T[ M" D)"7T*"0D)" D)"2\O(&1E;&5T92!U;G5S960 8V]L<R!A;F0 <F]W<PH) M"0EV;VED(&-O;7!R97-S5&%B;&4H*0H)"0E[" D)"0EM971H;V1S+FQE;F=T M6UT ;6%S=&5R5&%B;&4[" D)" EP=6)L:6,Z" D)=F]I9"!I;FET:6%L:7IE M*$)E:&%V:6]U<B!B96AA=FEO=7(I" D)>PH)"0EB96AA=FEO=7(N8V]M<')E M<W-486)L92 I.PH)"0EM87-T97)486)L92`](&)E:&%V:6]U<BYM971H;V1S M.PH)"0EC;&%S<TEN9&5X(#T 8F5H879I;W5R+F-L87-S26YD97 [" D)?0H) M"0H)"5)4(&]P0V%L;"A/8FIE8W0 87)G*0H)"7L*"0D):68 *"%A<F<I" D) M=6ET86)L92!C;VYV97)S:6]N(&9O=6YD(&9O<B!N=6QL(&%R9W5M96YT(BD[ M<TEN9F\ 87)G*0H)"0E[" D)"0EU:6YT(&ED>#L*"0D)"6EF("AA<F< :6X M8VQA<W-);F1E>"D*"0D)"0EI9' /2!C;&%S<TEN9&5X6V%R9UT[" D)"0EE M;'-E" D)"0D)<F5T=7)N(&YU;&P[" D)"0D)" D)"0E!8G-T<F%C=$1E;&5G M871E(&1G(#T ;6%S=&5R5&%B;&5;(&ED>"!=.PH)"0D)" D)"0EI9B`H9&< M9SL*"0D)"0D*"0D)"7)E='5R;B!N=6QL.PH)"0E]" D)"0H)"0DO+R!S96QE M8W1S('1H92!B97-T(&1E;&5G871E("AT:&4 ;&5A<W0 ;G5M8F5R(&]F('5P M8V%S="!C;VYV97)S:6]N<R!N965D960I" D)"2\O(&9O<B!A8W1U86P ='EP M92!O9B!A<F<*"0D)06)S=')A8W1$96QE9V%T92!B97-T1&5L96=A=&4[" D) M"79O:60 <W5B;6ET1&5L96=A=&4H0VQA<W-);F9O(&%R9RD*"0D)>PH)"0D) M:68 *"%A<F<I" D)"0D)<F5T=7)N.PH)"0D)" D)"0E!8G-T<F%C=$1E;&5G M871E(&1G(#T 9&5L96=A=&5&;W(H87)G*3L*"0D)"6EF("AD9RD +R\ :68 M9&5L96=A=&4 97AA8W1L>2!F;W( 87)G(&5X:7-T<PH)"0D)>PH)"0D)"2\O M(&EF('-U:71A8FQE(&YO="!F;W5N9"!Y970N+BX*"0D)"0EI9B`H(6)E<W1$ M96QE9V%T92D*"0D)"0E[" D)"0D)"6)E<W1$96QE9V%T92`](&1G.PD)"0D) M"0H)"0D)"7T*"0D)"0DO+R!E;'-E(&EF(&ET('=A<R!A;')E861Y(&9O=6YD M" D)"0D)96QS90H)"0D)"7L*"0D)"0D)=&AR;W< ;F5W($%M8FEG=6]U<T-A M;&Q%>&-E<'1I;VXH(DYO;F4 ;V8 =&AE(" B('X*"0D)"0D)"6)E<W1$96QE M9V%T92YA<F=U;65N=$-L87-S26YF;RYN86UE('X (BD 86YD(" B('X*"0D) M"0D)"6%R9RYN86UE('X (BD :&%S(&$ 8F5S="!C;VYV97)S:6]N(BD[" D) M"0D)?0D)"0D)" D)"0E]" D)"0EE;'-E" D)"0E[" D)"0D)+R\ =')A=F5R M<V4 9F]R(&)A<V4 8VQA<W-E<R!A;F0 :6YT97)F86-E<PH)"0D)"7-U8FUI M=$1E;&5G871E*&%R9RYB87-E*3L*"0D)"0EF;W)E86-H("A);G1E<F9A8V4 M:69A8V4[(&%R9RYI;G1E<F9A8V5S*0H)"0D)"0ES=6)M:71$96QE9V%T92AI M9F%C92YC;&%S<VEN9F\I.PH)"0D)?0H)"0E]" D)"0H)"0ES=6)M:71$96QE M9V%T92AA<F<N8VQA<W-I;F9O*3L*"0D*"0D):68 *"%B97-T1&5L96=A=&4I M;R!S=6ET86)L92!C;VYV97)S:6]N(&9O=6YD(&9O<B`H(B!^" D)"0D)87)G M+F-L87-S:6YF;RYN86UE('X (BDB*3L*"0D)?0H)"0D*"0D)<F5T=7)N(&)E M879I;W5R(&UE=&AO9', =VET:"!T=V\ 87)G=6UE;G1S"B`J+PIC;&%S<R!" M:6YA<GE-=6QT:6UE=&AO9"A25"D*>PH)+RHJ" D *B!);G1E<F9A8V4 <F5P M<F5S96YT<R!D96QE9V%T92!M971H;V0 9F]R(&1I<W!A=&-H('1A8FQE" D M*B\*"7!R:79A=&4 :6YT97)F86-E($%B<W1R86-T1&5L96=A=&4*"7L*"0EP M"0EP<F]T96-T960 0VQA<W-);F9O('-E8V]N9$%R9W5M96YT0VQA<W-);F9O M*"D[" D)" D)<'5B;&EC(%)4(&]P0V%L;"A/8FIE8W0 87)G,2P 3V)J96-T M(&%R9S(I.PH)?0H*"2\J* H)("H 0VQA<W, <F5P<F5S96YT<R!D96QE9V%T M92!M971H;V0 9F]R(&1I<W!A=&-H('1A8FQE('=I=& 9&5F:6YE9"!A<F=U M*2`Z($%B<W1R86-T1&5L96=A=&4*"7L*"0EP<FEV871E(%)4(&1E;&5G871E M*2!D9RD*"0E[" D)"6%S<V5R="AD9RD[" D)"71H:7,N9&< /2!D9SL*"0E] M"7T*"0D*"0EP<F]T96-T960 0VQA<W-);F9O('-E8V]N9$%R9W5M96YT0VQA M<W-);F9O*"D*"0E[" D)"7)E='5R;B!4,BYC;&%S<VEN9F\[" D)?0H)"0H) M"7!U8FQI8R!25"!O<$-A;&PH3V)J96-T(&%R9S$L($]B:F5C="!A<F<R*0H) M"0E]" E]" D*"2\J* H)("`J($)E:&%V:6]U<B!I<R!A(&-O;&QE8W1I;VX M;V8 ;65T:&]D<R!W:&ET:&EN('=I8V 82!B97-T(&ES('-E;&5C=&5D(&9O M< H)("`J(&EN=F]K:6YG(&%F=&5R(&%R9W5M96YT<R!D:7-P871C:`H)("`J M+PH)<'5B;&EC(&-L87-S($)E:&%V:6]U< H)>PH)"7!U8FQI8SH*"0D)0F5H M879I;W5R(&]P0V%T07-S:6=N*$%B<W1R86-T1&5L96=A=&4 9&<I" D)"7L* M"0D)"2\O($%S<VEG;B!I;F1E>"!T;R!A(&-L87-S(&EF(&ET(&1O97, ;F]T M(&%L<F5A9'D <F5G:7-T97)E9`H)"0D)=F]I9"!R96=I<W1E<D-L87-S*$-L M87-S26YF;R!C:2D*"0D)"7L*"0D)"0EI9B`H8VD :6X 8VQA<W-);F1E>"D* M"0D)"0D)<F5T=7)N.PH)"0D)"0D*"0D)"0EC;&%S<TEN9&5X6R!C:2!=(#T M"0D)"6-I6S%=(#T M"0H)"0D)+R\ :68 96ET:&5R(&]R(&)O=& 8VQA<W-E<R!A<F4 =7-E9"!F M;W( 82!F:7)S="!T:6UE(&=I=F4 =&AE;2!I;F1I8V5S" D)"0ER96=I<W1E M<D-L87-S*&-I6S!=*3L*"0D)"7)E9VES=&5R0VQA<W,H8VE;,5TI.PH)"0D) M" D)"0DO+R!G970 :6YD:6-E<PH)"0D)=6EN="!I9'A;,ET[" D)"0EI9'A; M,%T /2!C;&%S<TEN9&5X6R!C:5LP72!=.PH)"0D):61X6S%=(#T 8VQA<W-) M;F1E>%L 8VE;,5T 73L*"0D)"0H)"0D):68 *&ED>%LP72`^/2!M971H;V1S M+FQE;F=T:"!\?"!I9'A;,5T /CT ;65T:&]D<RYL96YG=& I" D)"0D)97AP M86YD5&%B;&4H*3L*"0D)"0H)"0D);65T:&]D<UL :61X6S!=(%U;(&ED>%LQ M72!=(#T 9&<[" D)"0D*"0D)"7)E='5R;B!T:&ES.PH)"0E]" D*"0EP=6)L M:6,Z("\O(%1/1$\Z(&UA:V4 <')I=F%T92!A9G1E<B!C;VUP:6QE<B!B=6=F M:7 *"0D)+R\ 1FER<W0 :6YD97 :7, 9FER<W0 87)G=6UE;G0 8VQA<W, M:6YD97 L('-I;6EL:6%R(&9O<B!S96-O;F0*"0D)06)S=')A8W1$96QE9V%T M95M=6UT ;65T:&]D<SL*"0D)" D)"75I;G0 ;F5X=$-L87-S26YD97 /2`P M.PH)"0EU:6YT(&-L87-S26YD97A;($-L87-S26YF;R!=.PH)"0D*"0EP=6)L M:6,Z("\O(%1/1$\Z(&UA:V4 <')I=F%T92!A9G1E<B!C;VUP:6QE<B!B=6=F M:7 *"0D)+R\ <V5T(&YE=R!D:6UE;G-I;VYS(&9O<B!M971H;V0 =&%B;&4* M"0D)=F]I9"!R97-I>F5486)L92AU:6YT(&1I;2D*"0D)>PH)"0D);65T:&]D M("LK:2D*"0D)"0EM971H;V1S6VE=+FQE;F=T:"`](&1I;3L)"0D)" D)"7T* M"0D*"0D)+R\ 9'5P;&EC871E('1A8FQE(&EN(&5A8V 9&EM96YS:6]N" D) M"79O:60 97AP86YD5&%B;&4H*0H)"0E[" D)"0EU:6YT(&1I;2`](&UE=&AO M9',N;&5N9W1H("H ,CL*"0D)"0H)"0D)+R\ :68 =&%B;&4 =V%S(&YU;&P M"0D*"0D)"7)E<VEZ951A8FQE*&1I;2D[" D)"7T*"0D)" D)"2\O(&1E;&5T M92!U;G5S960 8V]L<R!A;F0 <F]W<PH)"0EV;VED(&-O;7!R97-S5&%B;&4H M*0H)"0E[" D)"0ER97-I>F5486)L92AN97AT0VQA<W-);F1E>"D[" D)"7T* M"7T*"0H)<')I=F%T93H*"0EU:6YT(&-L87-S26YD97A;($-L87-S26YF;R!= M.PH)"0H)"4%B<W1R86-T1&5L96=A=&5;72!M87-T97)486)L93L*"0EU:6YT M('-H:69T5&%B;&5;73L*"0D*"7!U8FQI8SH*"0EV;VED(&EN:71I86QI>F4H M0F5H879I;W5R(&)E:&%V:6]U<BD*"0E[" D)"2\O(&UE<F=E('1W;R!R;W=S M(&]F(&1I<W!A=&-H('1A8FQE(&EN(&]N92!A;F0 <F5T=7)N(&QO=V5R4F]W M('-H:69T" D)"2\O(&YO=&4 =&AA="!T:&4 =7!P97)2;W< ;&5N9W1H(&ES M(&EN8W)E87-E9"!B>2!L;W=E<E)O=R!L96YG=& =VAA="!I<R!O9G1E; H) M"0DO+R!N;W0 ;F5C8V5S<V%R>2P <V\ :V5E<"!I;B!M:6YD('-H:69T<R!I M9B!Y;W4 =V%N="!F:6YA;'D =&\ ;6EN:6UI>F4*"0D)+R\ ;65M;W)Y('5S M86=E" D)"75I;G0 ;65R9V52;W=S*&EN;W5T($%B<W1R86-T1&5L96=A=&5; M72!U<'!E<E)O=RP 06)S=')A8W1$96QE9V%T95M=(&QO=V5R4F]W*0H)"0E[ M" D)"0DO+R!R971U<FYS('1R=64 :68 ;&]W97( <F]W(&-A;B!B92!M97)G M960 =VET:"!U<'!E<B!A9G1E<B!L;W=E<B!S:&EF=&EN9PH)"0D)+R\ =VET M:"!S:&EF="!V86QU90H)"0D)8F]O;"!I<TUE<F=A8FQE*'5I;G0 <VAI9G0I M" D)"0E[" D)"0D)87-S97)T*'-H:69T("L ;&]W97)2;W<N;&5N9W1H(#P] M('5P<&5R4F]W+FQE;F=T:"D[" D)"0D)" D)"0D)8F]O;"!M97)G86)L92`] M('1R=64[" D)"0D)9F]R("AU:6YT(&D /2`P.R!I(#P ;&]W97)2;W<N;&5N M9W1H.R`K*VDI" D)"0D)>PH)"0D)"0DO+R!E;&5M96YT<R!A<F4 ;65R9V%B M;&4 :68 96ET:&5R(&]R(&)O=& ;G5L;"!O<B!E<75I=F%L96YT" D)"0D) M"6EF("AL;W=E<E)O=UMI72`F)B!U<'!E<E)O=UMI("L <VAI9G1=("8F("$H M;&]W97)2;W=;:5T :7, =7!P97)2;W=;:2`K('-H:69T72DI" D)"0D)"0EM M97)G86)L92`](&9A;'-E.PH)"0D)"7T*"0D)"0D*"0D)"0ER971U<FX ;65R M9V%B;&4[" D)"0E]" D)"0D*"0D)"75P<&5R4F]W+FQE;F=T:"`]('5P<&5R M4F]W+FQE;F=T:"`K(&QO=V5R4F]W+FQE;F=T:#L*"0D)"0H)"0D)+R\ <V5A M<F-H(&UI;FEM86P <VAI9G0 =F%L=64*"0D)"75I;G0 <VAI9G0 /2`P.PH) M"0D)=VAI;&4 *"%I<TUE<F=A8FQE*'-H:69T*2D*"0D)"0DK*W-H:69T.PH) M"0D)" D)"0DO+R!M97)G92$*"0D)"69O<B`H=6EN="!I(#T ,#L :2`\(&QO M=V5R4F]W+FQE;F=T:#L *RMI*0H)"0D)"6EF("AL;W=E<E)O=UMI72D*"0D) M"0D)=7!P97)2;W=;<VAI9G0 *R!I72`](&QO=V5R4F]W6VE=.PH)"0D)" D) M"0ER971U<FX <VAI9G0[" D)"7T*"0D)" D)"6EF("AB96AA=FEO=7(N;65T M:&]D<RYL96YG=& /3T ,"D*"0D)"7)E='5R;CL*"0D)" D)"75I;G0 <F]W M3&5N9W1H(#T 8F5H879I;W5R+FUE=&AO9'-;,%TN;&5N9W1H.PH)"0EA<W-E M<G0H<F]W3&5N9W1H(#X ,"D[" D)"0H)"0EB96AA=FEO=7(N8V]M<')E<W-4 M86)L92 I.PH)"0EC;&%S<TEN9&5X(#T 8F5H879I;W5R+F-L87-S26YD97 [ M" D)"0H)"0DO+R!B=6EL9"!T86)L97,*"0D)=6EN="!J(#T ,#L*"0D)=6EN M="!M87A3:&EF=#L*"0D)<VAI9G1486)L92YL96YG=& /2!B96AA=FEO=7(N M;65T:&]D<RYL96YG=& [" D)"69O<F5A8V *$%B<W1R86-T1&5L96=A=&5; M72!R;W<[(&)E:&%V:6]U<BYM971H;V1S*0H)"0E[" D)"0EU:6YT('-H:69T M(#T ;65R9V52;W=S*&UA<W1E<E1A8FQE+"!R;W<I.PH)"0D)" D)"0DO+R!S M=&]R92!M87AI;6%L('-H:69T('9A;'5E(&9O<B!F=7)T:&5R('1A8FQE('-T M<FEP:6YG" D)"0EI9B`H<VAI9G0 /B!M87A3:&EF="D*"0D)"0EM87A3:&EF M="`]('-H:69T.PH)"0D)<VAI9G1486)L95MJ*RM=(#T <VAI9G0[" D)"7T* M"0D)" D)"2\O(&1E;&5T92!U;G5S960 96QE;65N=', 870 =&AE('1A:6P* M"0D);6%S=&5R5&%B;&4N;&5N9W1H(#T ;6%X4VAI9G0 *R!R;W=,96YG=& [ M"0D)" D)?0H)"0H)"5)4(&]P0V%L;"A/8FIE8W0 87)G,2P 3V)J96-T(&%R M9S(I" D)>PH)"0EI9B`H(6%R9S$ ?'P (6%R9S(I" D)"7L*"0D)"71H<F]W M97)S:6]N(&9O=6YD(&9O<B!N=6QL(&%R9W5M96YT(BD[" D)"7T*"0D*"0D) M0VQA<W-);F9O(&%R9S(I" D)"7L*"0D)"75I;G1;,ET :61X.PH)"0D):68 M*&%R9S$ :6X 8VQA<W-);F1E>"D*"0D)"0EI9'A;,%T /2!C;&%S<TEN9&5X M6V%R9S%=.PH)"0D)96QS90H)"0D)"7)E='5R;B!N=6QL.PH)"0D)"0H)"0D) M:68 *&%R9S( :6X 8VQA<W-);F1E>"D*"0D)"0EI9'A;,5T /2!C;&%S<TEN M9&5X6V%R9S)=.PH)"0D)96QS90H)"0D)"7)E='5R;B!N=6QL.PH)"0D)" D) M"0EU:6YT('-H:69T(#T <VAI9G1486)L95L :61X6S!=(%T[" D)"0E!8G-T M<F%C=$1E;&5G871E(&1G(#T ;6%S=&5R5&%B;&5;('-H:69T("L :61X6S%= M(%T[" D)"0D*"0D)"6EF("AD9R`F)B!D9RYF:7)S=$%R9W5M96YT0VQA<W-) M87)G,BD*"0D)"0ER971U<FX 9&<[" D)"0D)" D)"0ER971U<FX ;G5L;#L* M"0D)?0H)"0D*"0D)+R\ <V5L96-T<R!T:&4 8F5S="!D96QE9V%T92`H=&AE M(&QE87-T(&YU;6)E<B!O9B!U<&-A<W0 8V]N=F5R<VEO;G, ;F5E9&5D*0H) M"0DO+R!F;W( 86-T=6%L('1Y<&5S(&]F(&%R9S$ 86YD(&%R9S(*"0D)=6EN M="!M:6Y!<F<Q0V%S=', /2!U:6YT+FUA>#L*"0D)=6EN="!M:6Y!<F<R0V%S M=', /2!U:6YT+FUA>#L*"0D)06)S=')A8W1$96QE9V%T92!B97-T1&5L96=A M=&4[" D)"79O:60 <W5B;6ET1&5L96=A=&4H0VQA<W-);F9O(&%R9S$L($-L M" D)"7L*"0D)"6EF(" A87)G,2!\?"`A87)G,BD*"0D)"0ER971U<FX[" D) M"0D*"0D)"4%B<W1R86-T1&5L96=A=&4 9&< /2!D96QE9V%T949O<BAA<F<Q M+"!A<F<R*3L*"0D)"6EF("AD9RD +R\ :68 9&5L96=A=&4 97AA8W1L>2!F M;W( *&%R9S$L(&%R9S(I(&5X:7-T<PH)"0D)>PH)"0D)"2\O(&EF(&ET(&UO M<F4 <W5I=&%B;&4 9F]R(&)O=& 87)G<RXN+ H)"0D)"6EF("AA<F<Q0V%S M=', /#T M=',I" D)"0D)>PH)"0D)"0EB97-T1&5L96=A=&4 /2!D9SL*"0D)"0D);6EN M07)G,4-A<W1S(#T 87)G,4-A<W1S.PH)"0D)"0EM:6Y!<F<R0V%S=', /2!A M<F<R0V%S=',[" D)"0D)?0H)"0D)"2\O(&5L<V4 :68 ;VYE(&%R9R!H87, M82!M;W)E('-U:71A8FQE(&-O;G9E<G-I;VXL(&)U="!A;F]T:&5R(&QE<W,N M+BX*"0D)"0EE;'-E(&EF("AA<F<Q0V%S=', /"!M:6Y!<F<Q0V%S=', ?'P M87)G,D-A<W1S(#P ;6EN07)G,D-A<W1S*0H)"0D)"7L*"0D)"0D)=&AR;W< M;F5W($%M8FEG=6]U<T-A;&Q%>&-E<'1I;VXH(DYO;F4 ;V8 =&AE(" B('X* M"0D)"0D)"6)E<W1$96QE9V%T92YF:7)S=$%R9W5M96YT0VQA<W-);F9O+FYA M;64 ?B`B+"`B('X*"0D)"0D)"6)E<W1$96QE9V%T92YS96-O;F1!<F=U;65N M=$-L87-S26YF;RYN86UE('X (BD 86YD(" B('X*"0D)"0D)"6%R9S$N;F%M M92!^("(L("( ?B!A<F<R+FYA;64 ?B`B*2!H87, 82!B97-T(&-O;G9E<G-I M;VXB*3L*"0D)"0E]"0D)"0D*"0D)"7T*"0D)"65L<V4*"0D)"7L*"0D)"0DO M+R!T<F%V97)S92!F;W( 8F%S92!C;&%S<V5S(&%N9"!I;G1E<F9A8V5S" D) M"0D)<W5B;6ET1&5L96=A=&4H87)G,2YB87-E+"!A<F<R+"!A<F<Q0V%S=', M*R`Q+"!A<F<R0V%S=',I.PH)"0D)"69O<F5A8V *$EN=&5R9F%C92!I9F%C M93L 87)G,2YI;G1E<F9A8V5S*0H)"0D)"0ES=6)M:71$96QE9V%T92AI9F%C M" D)"0D)" D)"0D)<W5B;6ET1&5L96=A=&4H87)G,2P 87)G,BYB87-E+"!A M9F%C92!I9F%C93L 87)G,BYI;G1E<F9A8V5S*0H)"0D)"0ES=6)M:71$96QE M<W1S("L ,2D[" D)"0E]" D)"7T*"0D)" D)"7-U8FUI=$1E;&5G871E*&%R M9S$N8VQA<W-I;F9O+"!A<F<R+F-L87-S:6YF;RP ,"P ,"D[" D)" D)"6EF M(" A8F5S=$1E;&5G871E*0H)"0E[" D)"0ET:')O=R!N97< 06UB:6=U;W5S M0V%L;$5X8V5P=&EO;B B3F\ <W5I=&%B;&4 8V]N=F5R<VEO;B!F;W5N9"!F M;W( *"( ? H)"0D)"6%R9S$N8VQA<W-I;F9O+FYA;64 ?B`B+"`B('X 87)G M,BYC;&%S<VEN9F\N;F%M92!^("(I(BD[" D)"7T*"0D)" D)"7)E='5R;B!B M97-T1&5L96=A=&4H87)G,2P 87)G,BD[" D)?0I]" IU;FET=&5S=`I[" EI M;G1E<F9A8V4 02![?0H)8VQA<W, 0B`Z($$ >WT*"6-L87-S($, .B!"('M] M" EC;&%S<R!$(#H 0R![?0H)8VQA<W, 12![?0H)8VQA<W, 1B`Z($4L($$ M>WT*"0H)+R\ 5'EP92!H:65R87)C:'D *&YO9&5S(&UA<FME9"!W:71H(", M;65A;G, =V4 9&5F:6YE9"!M971H;V0*"2\O(&9O<B!T:&ES('1Y<&4 :6X M=6YA<GD ;75L=&EM971H;V0I" DO+PH)+R\ ("` ("` ("` ("` ("` ("` M("` ("` ("-!("`C10H)+R\ ("` ("` ("` ("` ("` ("` ("` ("` ("!\ M(%P ?`H)+R\ ("` ("` ("` ("` ("` ("` ("` ("` ("!"("` 1 H)+R\ M("` ("` ("` ("` ("` ("` ("` ("` ("!\(`H)+R\ ("` ("` ("` ("` M('P*"2\O("` ("` ("` ("` ("` ("` ("` ("` ("` 1`H)+R\*"0H)" DO M+R!":6YA<GD <')O9'5C="!H:65R87)C:'D *&YO9&5S(&UA<FME9"!W:71H M(", ;65A;G, =V4 9&5F:6YE9`H)+R\ ;65T:&]D(&9O<B!T:&ES('!A:7(I M" DO+PH)+R\ ("` ("` ("` ("` ("` ("` ("` 7U]?7U]?(T%!7U]?7U]? M("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` M("` (`H)+R\ ("` ("` ("` ("` ("` ("` ("`O("` ("` +R` 7"` ("` M7"` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` M("` ("`*"2\O("` ("` ("` ("` ("` ("` ("`O("` ("-!0B` ("!"02` M("!<("` ("` ("` ("` ("` ("` ("` ("` ("`*"2\O("` ("` ("` ("` M("` ("` ("\ ("` ("\ (%P ("\ (%P ("` 7"` ("` ("` ("` ("` ("` M("` ("` ("` " DO+R` ("` ("` ("` ("` ("` ("\ ("` 04, ("` 0D( M("` 0T$ ("!<("` ("` ("` ("` ("` ("` ("` ("` ("` " DO+R` ("` M("` ("` ("` ("` +R` ("`O("!<("`O("!<("`O("!<("` 7"` ("` ("` M("` ("` ("` ("` ("` ("` (`H)+R\ ("` ("` ("` ("` ("` ('P (T%$ M("` (`H)+R\ ("` ("` ("` ("` ("` ('P ("` 7"` +R` 7"` +R` 7"` M+R` ("!\("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` M0R` ("!$0B` ("` ?"` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` M("` ("` ("` ("` ("` ("`*"2\O("` ("` ("` ("` ("` ("!\("` ("` M(%P ("\ (%P ("\ ("` ("` ?"` ("` ("` ("` ("` ("` ("` ("` ("` M("` ("` ("` ("` ("` ("` ("` " DO+R` ("` ("` ("` ("` ("` ?"` M("` ("` 0T0 ("` 1$, ("` ("` ('P ("` ("` ("` ("` ("` ("` ("` M("` ("` ("` ("` ("` ("` ("` ("` " DO+R` ("` ("` ("` ("` ("` M?"` ("` ("` ("!<("`O("` ("` ("` ('P ("` ("` ("` ("` ("` ("` M("` ("` ("` ("` ("` ("` ("` ("` " DO+R` ("` ("` ("` ("` ("` M?"` ("` ("` ("` 1$0 ("` ("` ("` ('P ("` ("` ("` ("` ("` ("` M("` ("` ("` ("` ("` ("` ("` ("` " DO+R` ("` ("` ("` ("` ("` M?"` ("` ("` ("` ("` ("` ("` ("` ('P*"2\O("` ("` ("` ("` ("` M("` 7"` ("!!12` ("-%12` ("-%02` ("`O" DO+R` ("` ("` ("` ("` M("` ("!<("`O("` ("`O("!<("` ("!<("`O(`H)+R\ ("` ("` ("` ("` M("` ("` ($%&("` (T5&("` ($9%("` ($9!("`*"2\O("` ("` ("` ("` M("` ("` ("` (%P ("` (%P ("\ ("` ("\ ("` " DO+R` ("` ("` ("` M("` ("` ("` ("` 7%]?7U]?1D9?7U]?7R\ ("` (`H)+R\*"0H)8VQA<W, M5&5S=&5R" E[" D)8VAA<EM=(&9O;RA!(&QH<RP 02!R:',I" D)>PH)"0ER M971U<FX (D%!(CL*"0E]" D)" D)8VAA<EM=(&9O;RA!(&QH<RP 0B!R:',I M" D)>PH)"0ER971U<FX (D%"(CL*"0E]" D)" D)8VAA<EM=(&9O;RA!(&QH M<RP 1"!R:',I" D)>PH)"0ER971U<FX (D%$(CL*"0E]" D)" D)8VAA<EM= M(CL*"0E]" D)" D)8VAA<EM=(&9O;RA%(&QH<RP 12!R:',I" D)>PH)"0ER M971U<FX (D5%(CL*"0E]" D)" D)8VAA<EM=(&9O;RA%(&QH<RP 1B!R:',I M" D)>PH)"0ER971U<FX (D5&(CL*"0E]" D)" D)8VAA<EM=(&9O;RA%(&QH M<RP 02!R:',I" D)>PH)"0ER971U<FX (D5!(CL*"0E]" D)" D)8VAA<EM= M(&)A<BA!(' I" D)>PH)"0ER971U<FX (D$B.PH)"7T*"0D*"0EC:&%R6UT M8F%R*$, >"D*"0E[" D)"7)E='5R;B`B0R([" D)?0H)"0H)"6-H87);72!B M87(H12!X*0H)"7L*"0D)<F5T=7)N(")%(CL*"0E]" E]" D*"51E<W1E<B!T M(#T ;F5W(%1E<W1E<B I.PH)" EA;&EA<R!":6YA<GE-=6QT:6UE=&AO9"$H M8VAA<EM=*2!"34T[" E"34T 9F]O(#T ;F5W($)-32 I.PH)0DU-+D)E:&%V M:6]U<B!B8F5H(#T ;F5W($)-32Y"96AA=FEO=7(H*3L*"6)B96 ?CT ;F5W M($)-32Y$96QE9V%T92$H02P 02DH)G0N9F]O*3L*"6)B96 ?CT ;F5W($)- M32Y$96QE9V%T92$H02P 0BDH)G0N9F]O*3L*"6)B96 ?CT ;F5W($)-32Y$ M96QE9V%T92$H02P 1"DH)G0N9F]O*3L*"6)B96 ?CT ;F5W($)-32Y$96QE M9V%T92$H0BP 0RDH)G0N9F]O*3L*"6)B96 ?CT ;F5W($)-32Y$96QE9V%T M92$H0RP 0RDH)G0N9F]O*3L*"6)B96 ?CT ;F5W($)-32Y$96QE9V%T92$H M12P 12DH)G0N9F]O*3L*"6)B96 ?CT ;F5W($)-32Y$96QE9V%T92$H12P M1BDH)G0N9F]O*3L*"6)B96 ?CT ;F5W($)-32Y$96QE9V%T92$H12P 02DH M)G0N9F]O*3L*"69O;RYI;FET:6%L:7IE*&)B96 I.PH)" EA;&EA<R!5;F%R M>4UU;'1I;65T:&]D(2AC:&%R6UTI(%5-33L*"55-32!B87( /2!N97< 54U- M*"D[" E534TN0F5H879I;W5R('5B96 /2!N97< 54U-+D)E:&%V:6]U<B I M.PH)=6)E:"!^/2!N97< 54U-+D1E;&5G871E(2A!*2 F="YB87(I.PH)=6)E M97< 54U-+D1E;&5G871E(2A%*2 F="YB87(I.PH)8F%R+FEN:71I86QI>F4H M=6)E:"D[" D*"4( 8B`](&YE=R!"*"D[" E"(&, /2!N97< 0R I.PH)0B!D M(#T ;F5W($0H*3L*"44 92`](&YE=R!%*"D[" E%(&8 /2!N97< 1B I.PH) M" DO+R!B:6YA<GD ;65T:&]D<R!T97-T" EA<W-E<G0H(&9O;RAC+"!C*2`] M/2`B0T,B("D[" EA<W-E<G0H(&9O;RAB+"!B*2`]/2`B04(B("D[" EA<W-E M<G0H(&9O;RAD+"!C*2`]/2`B0T,B("D[" EA<W-E<G0H(&9O;RAF+"!E*2`] M/2`B144B("D[" EA<W-E<G0H(&9O;RAE+"!F*2`]/2`B148B("D[" EA<W-E M<G0H(&9O;RAF+"!F*2`]/2`B148B("D[" D)" ET<GD*"7L*"0EF;V\H8BP M17AC97!T:6]N(&4I" E[" D)87-S97)T*'1R=64I.PH)?0H)" DO+R!U;F%R M>2!M971H;V1S('1E<W0*"6%S<V5R=" 8F%R*&,I(#T M97)T*"!B87(H9"D /3T (D,B("D[" EA<W-E<G0H(&)A<BAB*2`]/2`B02( M*3L*"6%S<V5R=" 8F%R*&4I(#T](")%(B`I.PH)" ET<GD*"7L*"0EB87(H E17AC97!T:6]N(&4I" E[" D)87-S97)T*'1R=64I.PH)?0I]"G5O ` end
Feb 08 2005
I agree, multimethods are a very useful and powerful language feature. They should be added to D. "nail" <nail_member pathlink.com> wrote in message news:cuapgb$2ubv$1 digitaldaemon.com...I know some time ago 'pragma' wrote multimethods lib, I used it but unfortunatly found that it has bugs, has no feature to implicitly choose the best suitable signature and not always was typesafe. So I wrote my own, It supports unary and binary multimethods, and has no mentioned drawbacks. P.S: And nevertheless, I would very very happy if D begun to support mmethods natively. nail-mail <at> mail <dot> ru
Feb 08 2005
I have no experience with using multimethods. Looking at your implementation, though, I have the feeling that this is an even more complex issue than multiple inheritance and I doubt whether it is a good idea to move it into the language. Multimethods are not very efficient by principle. Even a native implementation in the compiler will not change that. If there are other details why you think a native implementation could do better than a library-based one, it might be an idea to identify these points and try to find ways to expand the language such that library-based multimethods can be implemented better. nail wrote:I know some time ago 'pragma' wrote multimethods lib, I used it but unfortunatly found that it has bugs, has no feature to implicitly choose the best suitable signature and not always was typesafe. So I wrote my own, It supports unary and binary multimethods, and has no mentioned drawbacks. P.S: And nevertheless, I would very very happy if D begun to support mmethods natively. nail-mail <at> mail <dot> ru
Feb 09 2005
In article <cucij7$1sa3$1 digitaldaemon.com>, Norbert Nemec says...I have no experience with using multimethods. Looking at your implementation, though, I have the feeling that this is an even more complex issue than multiple inheritance and I doubt whether it is a good idea to move it into the language. Multimethods are not very efficient by principle. Even a native implementation in the compiler will not change that. If there are other details why you think a native implementation could do better than a library-based one, it might be an idea to identify these points and try to find ways to expand the language such that library-based multimethods can be implemented better.First - dispatch table will be built at compile time. Second - compiler can ignore type checking in the places where it is obvious, i.e. cast(XXX) is similar dynamic_cast in C++, but there are some often called places in my implementation where I'm sure that my Object reference is realy XXX subclass reference, that places can be rewrited to static_cast. Third - compiler can automaticly index classes at compile-time. This topic was rised some time ago, but Walter refuse flatly buitin multimethods as I remember. nail-mail<at>mail<dot>ru
Feb 09 2005
Multimethods are not very efficient by principle. Even a native implementation in the compiler will not change that.You have no experience using multimethods, so how can you make such a rash statement about them? I DO have experience with them and they are very efficient if implemented correctly. They certainly can outperform the alternative, double dispatch. There are efficient ways to ensure a low memory footprint and an O(1) invokation. There has been much academic consideration of multimethods, but the average programmer doesn't know that they exist, let alone how powerful they are, so they are neglected. This is true of many programming paradigms. -Craig "Norbert Nemec" <Norbert Nemec-online.de> wrote in message news:cucij7$1sa3$1 digitaldaemon.com...I have no experience with using multimethods. Looking at your implementation, though, I have the feeling that this is an even more complex issue than multiple inheritance and I doubt whether it is a good idea to move it into the language.If there are otherdetails why you think a native implementation could do better than a library-based one, it might be an idea to identify these points and try to find ways to expand the language such that library-based multimethods can be implemented better. nail wrote:I know some time ago 'pragma' wrote multimethods lib, I used it but unfortunatly found that it has bugs, has no feature to implicitly choose the best suitable signature and not always was typesafe. So I wrote my own, It supports unary and binary multimethods, and has no mentioned drawbacks. P.S: And nevertheless, I would very very happy if D begun to support mmethods natively. nail-mail <at> mail <dot> ru
Feb 09 2005
Craig Black wrote:OK, sorry - I have rather strict criteria when talking about 'efficient'. Of course, efficiency always depends on the kind of problem you want to solve. If the problem inherently demands multi-dispatch, then it is certainly more efficient to have it built into the compiler than to do it 'by hand'. What I meant, is that you generally need to do some kind of a lookup at runtime. You say that this can be done O(1) - if that is indeed possible, it might change my view of the issue. As far as I can see, multi-dispatch will always need some lookup in a table. You may be able to implement this by using a btree or a hash-table, but neither of them is strictly O(1). Single-dispatch can simply be done by dereferencing a single pointer. This is still less efficient than static calls (especially on modern architectures, where it severely breaks branch prediction) but it is strictly O(1) with next to no overhead. For multi-dispatch, I cannot see any way to do that. If you have any pointers about it, I would personally be very interested. As for the design of D: it clearly is a difficult decision which features a language should support. Every programmer has some favorite programming style that depends on certain features in the language. Supporting everything is impossible and would lead to a cluttered language. Whether multimethods are important enough to include them is a matter of investigation. In any case, I would really want to see some real-world example that inherently depends on multimethods.Multimethods are not very efficient by principle. Even a native implementation in the compiler will not change that.You have no experience using multimethods, so how can you make such a rash statement about them? I DO have experience with them and they are very efficient if implemented correctly. They certainly can outperform the alternative, double dispatch. There are efficient ways to ensure a low memory footprint and an O(1) invokation.There has been much academic consideration of multimethods, but the average programmer doesn't know that they exist, let alone how powerful they are, so they are neglected. This is true of many programming paradigms.I can only fully support this statement.
Feb 10 2005
In article <cuf58k$1b8b$1 digitaldaemon.com>, Norbert Nemec says...Craig Black wrote:Also, the bonus is elegant simple syntax for mm defenition.OK, sorry - I have rather strict criteria when talking about 'efficient'. Of course, efficiency always depends on the kind of problem you want to solve. If the problem inherently demands multi-dispatch, then it is certainly more efficient to have it built into the compiler than to do it 'by hand'.Multimethods are not very efficient by principle. Even a native implementation in the compiler will not change that.You have no experience using multimethods, so how can you make such a rash statement about them? I DO have experience with them and they are very efficient if implemented correctly. They certainly can outperform the alternative, double dispatch. There are efficient ways to ensure a low memory footprint and an O(1) invokation.What I meant, is that you generally need to do some kind of a lookup at runtime. You say that this can be done O(1) - if that is indeed possible, it might change my view of the issue. As far as I can see, multi-dispatch will always need some lookup in a table. You may be able to implement this by using a btree or a hash-table, but neither of them is strictly O(1). Single-dispatch can simply be done by dereferencing a single pointer. This is still less efficient than static calls (especially on modern architectures, where it severely breaks branch prediction) but it is strictly O(1) with next to no overhead. For multi-dispatch, I cannot see any way to do that. If you have any pointers about it, I would personally be very interested.The best method for multi-dispatching I seen is multi-row displacement(matching). My library to some extent use ideas from it, but I couldn't implement it completely, 'cause it must be done within compiler. Read more at http://www.ifs.uni-linz.ac.at/~ecoop/cd/papers/1628/16280304.pdf. Alghorithm implemented on compiler side make binary multimethod call equivalent by time penalty to two virtual calls, triary to 4 virtual calls, n-ary to 2^(n-1) virtual calls, not bad.As for the design of D: it clearly is a difficult decision which features a language should support. Every programmer has some favorite programming style that depends on certain features in the language. Supporting everything is impossible and would lead to a cluttered language. Whether multimethods are important enough to include them is a matter of investigation. In any case, I would really want to see some real-world example that inherently depends on multimethods.I'm work in gamedevelopment industry and here there are a LOT of examples. Consider collision-detection: how beautiful will be if to compute collision point between two physical primitives using compact syntax of multimethods, not using annoying visitor pattern. Or another example: class RenderInstruction {} abstract class RenderSystem { void apply(RenderInstruction ins); } class Mesh : RenderInstruction {...} class MeshVB : RenderInstruction {...} class MeshIB : RenderInstruction {...} class D3DRenderSystem : RenderSystem { void apply(RenderInstruction ins); void apply(Mesh ins); void apply(MeshVB ins); void apply(MeshIB ins); } class NURBSSurface : RenderInstruction {...} class SomeNURBSRenderSystem : RenderSystem { void apply(RenderInstruction ins); void apply(NURBSSurface ins); } class SomeAnotherWayToDescribeShape : RenderInstruction {...} class SomeNotYetExistentRenderSystem : RenderSystem { void apply(RenderInstruction ins); void apply(SomeAnotherWayToDescribeShape ins); } I can store reference to RenderSystem wich actualy can be any and call apply with any RenderInstruction derived argument. Concrete render system will self make decision what to do whith this instruction. This architecture allows to add new render systems (even with absolutely another paradigm) without RenderSystem class changes. Of course this exaples can be solved without multimethods, but any problem can be solved without OOP at all. So the question is about readability and code maintenance.Victor Nakoryakov nail-mail<at>mail<dot>ruThere has been much academic consideration of multimethods, but the average programmer doesn't know that they exist, let alone how powerful they are, so they are neglected. This is true of many programming paradigms.I can only fully support this statement.
Feb 10 2005
For multi-dispatch, I cannot see any way to do that. If you have any pointers about it, I would personally be very interested.I am currently developing a simulation engine for DoD modeling and simulations. The simulation engine uses a template for two dimensional multimethods. The multimethods are used to describe relationships between different kinds of objects in the simulation. It requires that each type be enumerated. This is difficult to do using C++ RTTI, so I use my own type system. Once each type is enumerated, O(1) algorithms are possible. The simplest way to do this is with an N-Dimensional array of methods. Since each type's enumerated value will be its index into the array. Each multimethod must have its own array. The number of dimensions will correspond to the number of virtual parameters. It is easy to see why this method is so fast. It is simply indexing a lookup table. The problem is that these arrays can become considerably large, especially as the number of virtual parameters increases. For this reason, my currently implementation is limited to two dimensions. However, there are algorithms that compress the lookup tables and still retain the O(1) performance. The drawback is that this approach is considerably more complex and difficult to implement.As for the design of D: it clearly is a difficult decision which features a language should support. Every programmer has some favorite programming style that depends on certain features in the language. Supporting everything is impossible and would lead to a cluttered language. Whether multimethods are important enough to include them is a matter of investigation. In any case, I would really want to see some real-world example that inherently depends on multimethods.Well my vote is to include multimethods natively. I suppose that a first step to providing high-performance multimethods in D is providing enumeration values for the types. They would have to be enumerated from each base class. Thus if B inherits A and C inherits B, C would have two enumerations: one with base A and another with base B. (If I'm confusing you just let me know and I will expound some more.) This would allow for high-performance multimethod libraries to be written. The next step would be to add the keywords and syntax sugar that replaces those libraries. -Craig
Feb 10 2005
nail schrieb:I know some time ago 'pragma' wrote multimethods lib, I used it but unfortunatly found that it has bugs, has no feature to implicitly choose the best suitable signature and not always was typesafe.What are multimethods? Regards, Mark
Feb 09 2005
What are multimethods?Realization of so called late type binding. So if you have class A {} class B : A {} void foo(A u, A v) {...}; void foo(B u, B v) {...}; void main() { A b = new B(); foo(b, b); // foo(A, A) will be called } Multimethods is mechanism to redirect call to more suitable foo(B, B). To learn more google it. nail-mail<at>mail<dot>ru
Feb 09 2005
What are multimethods?Virtual methods could be considered to be a special case of multimethod. A virtual method is similar to a one-dimensional multimethod where "this" pointer is the virtual parameter. Multimethods are essentially methods with one or more virtual parameters. However, unlike virtual methods multimethods are not members of a particular class. Instead, they define relationships between classes. I like to use the term "object-relational paradigm" to describe multimethods. Here is an example where multimethods describe the relationship between simple shapes. This syntax uses the virtual keyword to denote a virtual parameter. class Shape { ... } class Triangle : Shape { ... } class Rectangle : Shape { ... } class Circle : Shape { ... } bool overlap(virtual Shape *a, virtual Shape *b) = 0; bool overlap(virtual Triangle *a, virtual Rectangle *b) { ... } bool overlap(virtual Rectangle *a, virtual Circle *b) { ... } bool overlap(virtual Triangle *a, virtual Circle *b) { ... } Then if you have two shape pointers, just invoke the overlap method and the appropriate overload will be called. Shape *a = new Triangle(...); Shape *b = new Circle(...); overlap(a, b); -Craig
Feb 09 2005