dynamic classes and duck typing

Pelle Månsson pelle.mansson at gmail.com
Tue Dec 1 12:06:27 PST 2009


Steven Schveighoffer wrote:
> On Tue, 01 Dec 2009 13:50:38 -0500, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> wrote:
> 
>> Steven Schveighoffer wrote:
>>> On Sat, 28 Nov 2009 18:36:07 -0500, Walter Bright 
>>> <newshound1 at digitalmars.com> wrote:
>>>
>>>> And here it is (called opDispatch, Michel Fortin's suggestion):
>>>>
>>>> http://www.dsource.org/projects/dmd/changeset?new=trunk%2Fsrc@268&old=trunk%2Fsrc@267 
>>>>
>>>  I have a few questions:
>>>  1. How should the compiler restrict opDispatch's string argument?  
>>> i.e. if I implement opDispatch, I'm normally expecting the string to 
>>> be a symbol, but one can directly call opDispatch with any string (I 
>>> can see clever usages which compile but for instance circumvent const 
>>> or something), forcing me to always constrain the string argument, 
>>> i.e. always have isValidSymbol(s) in my constraints.  Should the 
>>> compiler restrict the string to always being a valid symbol name (or 
>>> operator, see question 2)?
>>
>> Where in doubt, acquire more power :o). I'd say no checks; let user 
>> code do that or deal with those cases.
> 
> It is unlikely that anything other than symbols are expected for 
> opDispatch, I can't think of an example that would not want to put the 
> isValidSymbol constraint on the method.
> 
> An example of abuse:
> 
> struct caseInsensitiveWrapper(T)
> {
>    T _t;
>    auto opDispatch(string fname, A...) (A args)
>    {
>       mixin("return _t." ~ toLower(fname) ~ "(args);");
>    }
> }
> 
> class C { int x; void foo(); }
> 
> caseInsensitiveWrapper!(C) ciw;
> ciw._t = new C;
> ciw.opDispatch!("x = 5, delete _t, _t.foo")();
> 
> I don't know if this is anything to worry about, but my preference as an 
> author for caseInsensitiveWrapper is that this last line should never 
> compile without any special requirements from me.
> 
>>
>>> 2. Can we cover templated operators with opDispatch?  I can envision 
>>> something like this:
>>>  opDispatch(string s)(int rhs) if(s == "+") {...}
>>
>> How do you mean that?
> 
> Isn't opBinary almost identical to opDispatch?  The only difference I 
> see is that opBinary works with operators as the 'symbol' and dispatch 
> works with valid symbols.  Is it important to distinguish between 
> operators and custom dispatch?
> 
> -Steve
opBinary is a binary operator, opDispatch can be anything. I think they 
should be kept separate.



More information about the Digitalmars-d mailing list