opDispatch and operator overloads
Maxim Fomin
maxim at maxim-fomin.ru
Tue May 21 11:24:50 PDT 2013
On Tuesday, 21 May 2013 at 10:53:04 UTC, Timon Gehr wrote:
> On 05/21/2013 10:40 AM, Maxim Fomin wrote:
>> On Monday, 20 May 2013 at 23:10:48 UTC, Timon Gehr wrote:
>>> ...
>>>> In some notorious cases such artificiality created
>>>> problems (for local convenience at the expense of language
>>>> consistency)
>>>
>>> I don't see how this is relevant. The compiler behaviour is
>>> at the
>>> expense of language consistency, as I have argued above.
>>>
>>>> are not easy to fix (ref), or are unfixable by design
>>>> (@disable), or are
>>>> broken and dumped without touch for ages (delegates).
>>>>
>>>
>>> I disagree with those assertions.
>>> What is the conceived issue with delegates?
>>
>> Conceived issue is that they are holes in type system (unlike
>> casts and unions they are not supposed to be), let alone there
>> numerous bugs related to their implementation. See Bugzilla for
>> particular examples.
>>
>
> I see. I reported a few of those recently. Some of them got
> fixed.
>
>>>> Clearly, bugs should not stop from implementing a good
>>>> feature, but here
>>>> I see low benefits and some problems.
>>>> ...
>>>
>>> This is not about implementing a new feature. This is about
>>> fixing an
>>> implementation bug. Otherwise the compiler behaviour would
>>> need to be
>>> carried over to the spec. Doing nothing about it is not valid.
>>
>> You *think* that it is a bug and this cliam is not necessaruly
>> true.
>
> A compiler bug is a discrepancy between spec and compiler. It
> is a bug given the current spec.
>
>> According to spec you are promised to have a.foo(b) from
>> foo(a,b) but you are not promissed to have anything beyond that
>
> The fundamental problem is obviously that the "spec" is not
> fully unambiguous, but consider:
>
> https://en.wikipedia.org/wiki/Abstract_rewriting_system
>
> You are free to disagree by using different than usual
> fundamental notions, but if those are to be used by the
> language, they need to be defined by the spec.
>
> E.g. we'd need to introduce hidden state into the AST:
> Rewritten code would not be D code anymore, which removes most
> of the benefits of using rewrite rules for specification in the
> first place. (but given that the rewriting system given by the
> various rules from the spec does not appear to be confluent,
> this is a moot point anyway.)
>
>> (including several stages of rewrite for operator overloading).
>
> Given the assumption that the spec implies a limit on the
> number of such "stages", why would the limit be 1 and not 2 or
> 3? Why not even other numbers?
>
>> Please stop presenting a POV as absolute truth.
>
> Mathematical truth. To disagree with it you'd either:
>
> [1] Question the axioms or definitions.
> => In this case, my argument is valid, but this is not
> relevant for
> => you. I guess most of the arguing about language features
> goes on in
> => this section. To settle disputes here, concrete examples
> showing
> => the merits of your own viewpoint are usually useful.
>
> [2] Show a flaw in reasoning.
>
> [3] Be wrong.
According to the spec (overload page and TDPL) operators are
rewritten specifically named *member* functions and calling
*member* function is not the same thing as syntax to call free
functions like member functions due to:
- non-member (UFCS) functions cannot be virtualized and overridden
- they do not appear in get members traits
- they cannot access all fields in general.
Using your rewriting notation operator overloading is defined as
(a - expression, b - some member function other than opDispatch,
c - opDispatch): if (a && b) then a->b else error. Opdispatch is
defined as: if(!b && c) then b->c else error.
So, compiler works according to the spec.
By the way, your logic for a->b->c leads to following flaw:
class A
{
void opSlice(){}
void opDispatch(){}
}
..
a[] // unconditionally calls opDispatch since
'[]'->'opSlice'->'opDispatch'
More information about the Digitalmars-d
mailing list