Experiment: Implementing Multiple Dispatch in D (need vararg call)

Bruno Medeiros brunodomedeirosATgmail at SPAM.com
Wed Aug 2 14:10:28 PDT 2006


Bruno Medeiros wrote:
> I watched some time ago a Google TechTalk about Common Lisp (
> http://video.google.com/videoplay?docid=448441135356213813&q=peter+seibel
> ) where, as expected from a Lispanatic, LISP is idolized and Java is 
> whined about.
> 
> 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 feature 
> could be implemented in D, as an experimental, proof-of-concept, 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 the funtion's parameters limited to 
> some point(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 number of arguments. That is, 
> I have a:
> 
> Compile time parameter which is the number of arguments:
>   N
> 
> The arguments:
>   Object[N] objar;
> 
> An array-like template that provides the exact (class) type of each of 
> those arguments:
>   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]
>   );
> 
> Note that dispatchfn is not a variadic function, it is a normal function 
> with N parameters.
> Is this possible? I fear it is not, at least without entering into 
> ABI-dependent hackery, which I would like to avoid :/ (but which I guess 
> is still better than nothing).
> 
> 

Ah crap... I sent two messages by mistake. This is the one I wanted to
send. (this was due to me being under dialup now during Summer, and
wobbling around between TB's online and offline mode)

Anyway, yes, bind does work for that, I should have remembered that. I
guess I was thinking of something that would work for an unlimited
number of parameters.

This experiment was rich, I've noted quite some issues about D, although
it's a very small piece of code. I'll post it later when it is done,
plus the issue comments. It won't properly work though, as one of the
thing I've stumbled is a template bug that I think I can't workaround
(the code that triggers it is itself was a workaround for another
limitation...).

[PS: And this message was supposed to have been sent yesterday]

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