On Tuesday, October 16, 2018 at 6:33:26 AM UTC-4, alanfo wrote:
>
> However, I think it's important to learn the lessons of the past and not
> follow languages such as C++ or Scala where you can overload virtually
> anything or even make up your own operators which can result in confusing
> or even write-only code.
>
Strongly agreed. I too would be OK with only allowing a simple subset of
operators to be overloaded - excluding && and ||, notably; I wrote up that
possibility as a way of exploring the edges of the proposal. not as a
serious amendment.
On the other hand, I think it's important as a matter of good interface
psychology not to be arbitrary. That is, having introduced "implements",
the question "why can't I overload operator foo" should always have an
answer that is principled and specific to a given operator. For example,
we might disallow / because the relationship between its operand types and
result type is not obvious by inspection.
That criterion might also be a principled way to knock out short-circuit
use of && and || on non-booleans. On the other hand, I don't know that I
want to be quite that austere. If someone said to me "I want to overload
<- for a struct wrapping a channel type, why is that excluded," I don't
think I'd have a satisfactory answer
I would also disallow overloading of the =, :=, <-, ..., [], {}, () and yes
> - equality operators - as well because I believe to do otherwise would be
> very confusing.
>
I wouldn't exclude ==. Even if we have to have a special exclusion for
pointer types, any generic/overloading system that didn't support that is
something most people who want generics would regard as a cruel tease.
:= is not an operator at all in Go (and nor is =), unless I'm missing
something basic. I don't usually think of [], {}, () as operators either,
though one could make a case for [] as a dyadic indexing/mapping operator.
I wouldn't be hostile to including that in the allowed set, but I wouldn't
cry if it were excluded either.
Another possibility would be to introduce two new ordering operators,
> perhaps >< (for ==) and <> (for !=), which *could* be overloaded though
> the first of these would take some getting used to!
>
This is not keeping it simple. Excuse me, but I think you are now making
the sound of someone getting lost in the weeds. ;-)
As for Eric's proposal - using an 'implements' keyword - I like it for the
> following reasons:
>
> 1. It avoids the need to make up a long list of names for the operators
> which folks either have to remember or look up in the spec.
>
> 2. It makes it easier to retrofit operator overloading to existing types
> for which suitable methods have already been defined.
>
> 3. As 'implements' would only be used in contexts which don't exist at
> present, it needn't be a 'full' keyword and would therefore be backwards
> compatible.
>
These points had occurred to me, though I did not make them explicit in my
proposal. In my invention process, the idea of using operator signatures
as implied contracts came first. I was then searching for a way to restrict
the parse context in which new syntax might collide with identifiers in
existing code and came up with the "implements" clause and its location
just before a method's leading { as a way to accomplish that restriction.
> One area that hasn't been addressed so far is conversions. To convert to
> say, int64, I'd suggest 'implements int64()' and to convert from int64
> perhaps 'implements T(int64)' where T is the method's receiver type. TBH, I
> don't particularly like the idea of user-defined conversions at all but
> they're probably inevitable if you want to have unified generic constraints
> and at least they'd always be explicit.
>
I am neutral on whether the contract system should support conversions. If
the consensus is that they're needed, fine by me; if not, also fine by me.
I do not regard either position as a hill that "implements" should die on.
> Subject to all this, I think it might well be possible to get rid of
> contracts and just use interfaces for generic constraints.
>
That was more or less my goal. All the contract proposals I have seen
struck me as clever but overweight.
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.