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