Proof of Concept: Implementing Multiple Dispatch in D (need vararg call)
Tom S
h3r3tic at remove.mat.uni.torun.pl
Mon Jul 31 16:57:52 PDT 2006
Kirk McDonald wrote:
> Bruno Medeiros wrote:
>> 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).
>>
>
> Sounds like you want tuples. Tom S's 'bind' module might do what you're
> looking for. Search digitalmars.D.announce for the thread 'A library
> similar to boost::bind'.
Yup, I think you might like my Tuple and Apply modules from the Bind lib:
www.mat.uni.torun.pl/~h3r3tic/bind.rar
--
Tomasz Stachowiak
More information about the Digitalmars-d-learn
mailing list