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