Objective-D, reflective programming, dynamic typing

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Fri Apr 3 09:19:09 PDT 2009


Tomas Lindquist Olsen wrote:
> On Fri, Apr 3, 2009 at 5:20 PM, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> wrote:
>> Jarrett Billingsley wrote:
>>> On Fri, Apr 3, 2009 at 10:38 AM, Eljay <eljay at adobe.com> wrote:
>>>
>>>> Alas, I'm not sure how to pass the variadic arguments through to another
>>>> variadic function, with this
>>>> signature:
>>>> void perform(...)
>>> You can't.  D's varargs suck.
>> Of course you can. Where did that come from?
>>
>> void foo(T...)(T args) { bar(args); }
>> void bar(T...)(T args) {  foreach (a; args) writeln(a); }
>>
>> void main()
>> {
>>    foo(3, 4.5);
>> }
>>
>> prints:
>>
>> 3
>> 4.5
>>
>>
>> Andrei
>>
> 
> That's not a D vararg, it's a variadic template!

Well I guess I'll take that as a compliment.

> I've made proposals to allow this properly (without templates) before
> so I'm not going to waste time on that again...

I, too, believe it would be a waste of time, but probably for different 
reasons. Look at this:

void fun(...)
{
     ... use void* _argptr and TypeInfo[] _arguments ...
}

I'll ignore the fact that binding the arguments to magic, predefined 
names has the elegance of a fart interrupting a solemn moment. The 
larger problem is the type of _argptr.

No safety can be built into a function that traffics in void*, EVER. No 
matter what you do. A proverb goes "No matter how nicely you dress a 
mule, you'll still call it a mule." (It was s/mule/ass/g in Romanian, 
but ass is ambiguous in English.) So yes, it would be a waste of time to 
embellish a fundamentally deeply unsafe feature. A better use of time 
would be to improve its safe counterpart.


Andrei



More information about the Digitalmars-d mailing list