Fully dynamic d by opDotExp overloading
downs
default_357-line at yahoo.de
Sat Apr 18 04:33:28 PDT 2009
Andrei Alexandrescu wrote:
> Denis Koroskin wrote:
>> On Fri, 17 Apr 2009 18:24:04 +0400, Steven Schveighoffer
>> <schveiguy at yahoo.com> wrote:
>>
>>> On Fri, 17 Apr 2009 09:44:09 -0400, Leandro Lucarella
>>> <llucax at gmail.com> wrote:
>>>
>>>> I don't fully understand the example though. In writefln((v.qq = 5).i),
>>>> how is that B.i is assigned to 5 if the opDotExp("qq", 5) don't
>>>> propagate
>>>> the 5 to the new B()?
>>> I think it translates to
>>>
>>> opDotExp("qq") = 5
>>>
>>> Without knowing the signature of qq, how is the compiler supposed to
>>> infer that it is a property? In fact, I think this might be a
>>> limitation of this syntax, you can't define dynamic properties.
>>>
>>> I for one, can't really see a huge benefit, but then again, I don't
>>> normally work with dynamic-type langauges. It looks to me like a
>>> huge hole that the compiler will ignore bugs that would have been
>>> caught if the methods were strongly typed:
>>>
>>> class c
>>> {
>>> void opDotExp(char[] methodname,...)
>>> {
>>> if(methodname == "mymethod")
>>> callMyMethod();
>>> else
>>> throw new Exception("bad method name: " ~ methodname);
>>> }
>>> }
>>>
>>> void foo(c myc, bool rarelySetToTrue)
>>> {
>>> if(rarelySetToTrue)
>>> myc.mymethud(); // compiles, will throw runtime exception
>>> }
>>>
>>> Also, how do you overload the return value? Using this proposal,
>>> you can't have different dynamic methods that return different types.
>>>
>>> -Steve
>>
>> Here is how it could be done:
>>
>> class C
>> {
>> auto opDot(string methodName, T... args)(T args) // opDotExp
>> renamed to opDot
>> {
>> static if (methodName == "length") {
>> return _length; // return type is size_t
>> } else static if (methodName == "resize") {
>> _resize(args); // return type is void
>> }
>> }
>> }
>>
>> This is a great use-case for compile-time "static switch". Can we haz
>> one, please?
>
> I think the more urgent need is for static loops. At least we have a
> simple workaround for static switch.
>
> Andrei
Static loops are simple, at least in functions.
import std.stdio;
template Tuple(T...) { alias T Tuple; }
template Repeat(T, int I) { static if (!I) alias Tuple!() Repeat; else alias Tuple!(T, Repeat!(T, I-1)) Repeat; }
void main() {
foreach (i, bogus; Repeat!(void, 15))
writefln(i);
}
More information about the Digitalmars-d
mailing list