Fully dynamic d by opDotExp overloading
Steven Schveighoffer
schveiguy at yahoo.com
Fri Apr 17 08:27:38 PDT 2009
On Fri, 17 Apr 2009 11:11:55 -0400, davidl <davidl at nospam.org> wrote:
> 在 Fri, 17 Apr 2009 22:24:04 +0800,Steven Schveighoffer
> <schveiguy at yahoo.com> 写道:
>
>> 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.
>>
>
> The opDotExp overload func is supposed to deal with that, because it's
> in your hand to deal with the dynamic properties. The example here is
> illustrating the dynamic properties.
except, you can't define a property like:
void prop(int x)
{
_prop = x ^ ~0;
}
Using a dynamic method.
>
>> 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
>> }
>>
>
> The problem is you're dealing with the class which is overloaded its
> opDot. You know the risk before hand, you are not going to overload for
> every classes. Here, you seem to little bit overrate this feature. :)
> If you want things checked, then you probabely need to go back to
> static. This dynamic stuff is used for dynamic things only, and as long
> as you have to do it in the dynamic way that means you have no easy way
> or even impossible to check it at compiletime and you accept the
> potential risk like the example you posted.
Sure, but what is the reason to need dynamic methods? I'm just trying to
understand the usefulness of it. If a method is dynamic, we lose the
following things:
- compile-time type/signature checking
- IDE assistance in determining which methods are available
- ease of tracing where a method call goes.
- not future proof -- for example, if a method name gets changed or moved,
the code using the method still compiles.
If we lose all these things, there must be *something* we gain by doing
this, right?
Also, what is the benefit of doing something like this versus specifically
calling the dispatcher instead of having the compiler translate it?
>
>> Also, how do you overload the return value? Using this proposal, you
>> can't have different dynamic methods that return different types.
>>
>
> Umm, maybe make the compiler to pass the return type into the opDot
> would allow the opDot func to decide which overload func to call.
Walter already has issues overloading on return type, I'm not sure this is
any different.
-Steve
More information about the Digitalmars-d
mailing list