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