Proof of Concept: Implementing Multiple Dispatch in D (need vararg call)

Bruno Medeiros brunodomedeirosATgmail at SPAM.com
Mon Jul 31 12:28:06 PDT 2006


I watched some time ago a Google tech about Common Lisp ( 
http://video.google.com/videoplay?docid=448441135356213813&q=peter+seibel
) where the Lispanatic speaker exalts LISP and whines about Java.

The second part of the talk, talks about the CLOS (Common Lisp Object 
System) multiple dispatch system (called multimethods on Lisp lingo), 
and how it can be useful, etc.., and how in Java it all had to be 
implemented manually and non-generically (i.e., for each particular usage).

I wondered, how would D fare? I started to think if and how that could 
be implemented in D, as a proof-of-concept, D testing, and template 
learning exercise. The first thing needed, I noticed, was a compile time 
reflection mechanism, for functions at least (to find it's parameter 
types). With some IFTI incantations this is actually already possible, 
but with the number of parameters limited (this is what TomS's funcmeta 
does).

So I've started out and I got a near complete implementation, but 
then... I've just noticed I need one more thing: the ability to call a 
function with a constant but parameterized arguments.
That is I have a:
Compile time constant (template param) which is the number of args:
   N
The arguments:
   Object[N] objar;
An array-like template that provides the (class) type of each argument 
of the function to be called:
   funcTypeINFO.arg!( int n )
And then I would need to call a function like this:

   dispatchfn(
     cast(funcTypeINFO.arg!(0)) objar[0],
     cast(funcTypeINFO.arg!(1)) objar[1],
     ...
     cast(funcTypeINFO.arg!(N)) objar[N]
   );

Is this possible? I fear this is not possible without entering into 
ABI-dependent hackery :/ which I would like to avoid (but is better than 
nothing).




-- 
Bruno Medeiros - MSc in CS/E student
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D



More information about the Digitalmars-d-learn mailing list