Objective-D, reflective programming, dynamic typing

grauzone none at example.net
Fri Apr 3 09:27:25 PDT 2009


Andrei Alexandrescu wrote:
> 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.

That surprises me. Your string mixin callbacks (or whatever is the 
correct name for this idiom) in std.algorithm also use magic, predefined 
names like "a".

> 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.

The void* is paired with a TypeInfo. A Variant uses raw data and 
TypeInfo, and manages to be reasonably safe. If you want guaranteed 
safety, you must use something like Java (or SafeD vaporware).

> Andrei



More information about the Digitalmars-d mailing list