Do you have actual examples of how that would be useful to you? On Monday, September 10, 2018 at 9:45:12 PM UTC-4, Larry Clapp wrote: > > The conversation here is deep, and I haven't followed all of it. I > *think* y'all are discussing some different contract system than the > actual draft proposal? > > If that's the case: > > You can't express field-accessors, which is an actual, inarguable >> reduction in power that I'm perfectly fine with > > > How would you instantiate a generic function that wanted to access field F > of a generic type T? > > if you can't do that, well, I'm not fine with that. > > But I may have misunderstood. > > — L > > On Monday, September 10, 2018 at 7:45:04 PM UTC-4, Axel Wagner wrote: >> >> The unambiguous cases aren't ambiguous of course. It's the ambiguous >> cases I'm concerned about :) My post and this thread contain a bunch of >> those. They are mostly growing out of builtin functions and things like >> `range` statements and index-expressions. >> >> You can translate all of my "pseudo-interfaces" into a clear and short >> contract >> >> contract comparable (v T) { v == v } // also allows != >> contract ordered (v T) { v < v } // also allows <=, >, >= >> contract boolean (v T) { v || v } // also allows &&, ! >> contract bitwise (v T) { v & v } // also allows |, ^, <<, >> >> contract arith (v T) { v * v } // also allows +, -, / >> // well, this one's a bit harder… >> contract concat (v T) { v + v; v == "" } // also allows range, >> index[int], copy >> contract complex (v T) { real(v) } // also allows imag(v) >> contract nilable (v T) { v == nil } // also allows != nil >> >> There is some discussion about maps, slices and channels to be had - but >> I think the vast majority of interesting cases can be covered by taking >> e.g. a `chan T`. A defined type with underlying type `chan T` is assignable >> to that, so it would appear a perfectly fine way to express this contract >> contract Chan (ch C, el T) { var x T = <-ch; ch <- x } >> (and correspondingly for send/recv-only channels). >> >> You can't express field-accessors, which is an actual, inarguable >> reduction in power that I'm perfectly fine with (similarly to how we're >> fine with interfaces not being able to express that). >> >> Which IMO brings up the question: If we can express the vast majority (or >> even all) of the needed contracts as combinations of this handful of >> base-cases, why would we need to allow the full power of Go syntax, which >> enables to write all the less than obvious ones too? >> >> (to re-emphasize: All of this isn't polished. I did sanity-check against >> the examples in the contract design doc, but I have not put enough thought >> into it that there might not be a couple nooks and crannies I haven't >> thought of, as you've proven before :) ) >> >> On Tue, Sep 11, 2018 at 1:21 AM Jonathan Amsterdam <jbams...@gmail.com> >> wrote: >> >>> >>> >>> On Monday, September 10, 2018 at 4:17:57 PM UTC-4, Axel Wagner wrote: >>>> >>>> On Mon, Sep 10, 2018 at 8:57 PM Jonathan Amsterdam <jbams...@gmail.com> >>>> wrote: >>>> >>>>> FWIW, I think Ian's criticism of not wanting a list of new identifiers >>>>>> to express operator constraints is fair. It is a genuine roadblock to c) >>>>>> and if we're dead set of setting that as a baseline requirement, I agree >>>>>> that a declarative/interface-based approach won't work. >>>>>> >>>>> >>>>> I don't understand. Why are names so important? Why couldn't you use >>>>> "T == T" to mean "T is comparable"? Or "To(From)" to mean "From is >>>>> convertible to To"? >>>>> >>>> >>>> It's not the name that is important, it's the declarative nature. I and >>>> other people have already gone into detail with the problems we are having >>>> with using imperative constructs to define constraints (mainly that they >>>> are ambiguous and that it's hard both to enumerate the sets allowed by a >>>> contract and to define a suitable contract for an intended set of >>>> constraints). >>>> >>> >>> I completely agree with you there (although I find the >>> declarative/imperative terminology confusing). I think that except for >>> interface-like constraints, we should be constraining by broad properties >>> of types like comparable, ordered and numeric, rather than specific >>> operations. >>> >>>> >>>> >>> I don't care if the declarative instruction is called "flooglehorn" or >>>> "comparable". But I do care that it's an an actual declaration, mapping >>>> 1:1 >>>> in a clear way to intent. Not an ambiguous statement from Go's current >>>> Grammar. >>>> >>> >>> It wouldn't be ambiguous. The spec would say "in type constraints, `T == >>> T` means that T is comparable". I think people would learn to understand >>> that, just as they understand that for a type T, `*T` means "pointer to T," >>> not "dereference T". >>> >>> >>> >>> >>>> >>>> >>> >>>> Personally, I don't think that should be a requirement. Personally I >>>>>> think it's worth adding extra identifiers, if we get declarative >>>>>> constraint-specs for that - but that's just my opinion and everyone has >>>>>> one >>>>>> of those. >>>>>> >>>>>> But the issues you are bringing up are IMO not "fundamental'. a) to >>>>>> c) from above aren't really touched by your criticism, AIUI. To me, they >>>>>> seem like issues of syntax and how to phrase the spec. >>>>>> >>>>>> But if generics are to have operator constraints like T == T, then >>>>>>> something in the language has to change. Either not all interfaces are >>>>>>> types, or some interfaces have methods that can't be called, or Go >>>>>>> operators can have operands of different types. These changes are not >>>>>>> minor >>>>>>> tweaks: they alter fundamental aspects of the language. >>>>>>> >>>>>>> Contracts, on the other hand, are purely additive. They only come >>>>>>> into play when writing generic code. If I'm not mistaken, the draft >>>>>>> design >>>>>>> doesn't change or even add anything to non-generic Go. There is >>>>>>> something >>>>>>> attractive about that orthogonality. >>>>>>> >>>>>> >>>>>> I agree. I think that's fair. I don't think for that they need to be >>>>>> imperative specifications though. >>>>>> >>>>>> (or, allow embedding interfaces into contract-declarations, remove >>>>>>>> the "type-checking function body" idea and instead define a set of >>>>>>>> base-contracts you can use for operators) and you'd end up with pretty >>>>>>>> much >>>>>>>> my design. >>>>>>>> >>>>>>> >>>>>>> That doesn't sound like your original design at all. >>>>>>> >>>>>> >>>>>> You need to squint harder :) From the rest of your mail, ISTM that we >>>>>> are putting emphasis on different aspects of my description and the >>>>>> contracts design. What I was trying to say is that IMO the things about >>>>>> my >>>>>> design I like and the things about the contract design you like can >>>>>> probably be reconciled. >>>>>> >>>>>> The first seems problematic, because for multi-parameter contracts >>>>>>> you wouldn't know which type the parameter referred to. >>>>>>> >>>>>> >>>>>> FWIW (we are now getting lost in ifs-and-buts and it's no longer >>>>>> clear what the specific ideas are we are talking about), in my original >>>>>> design as well as that ad-how handwaving you're quoting, constraints >>>>>> always >>>>>> apply to a single type and you'd use parametric interfaces (or… >>>>>> interfaces+) to express simultaneous restrictions. >>>>>> >>>>>> But FTR, I did not intend to start an actual discussion around that, >>>>>> its far too underspecified for that. I was sincere when I said your >>>>>> criticism is fair and that I had to think about it. My handwaving was >>>>>> just >>>>>> to explain why I don't think it can justifiable be called a >>>>>> *fundamental* issue. >>>>>> >>>>>> >>>>>>> The second seems reasonable to me. Now we can talk about issues like >>>>>>> whether this adds too many names to the language, or whether you've >>>>>>> described all the important constraints (I think conversion and >>>>>>> assignability are important, for instance). >>>>>>> >>>>>> >>>>>> Again, the caveat of handwaving still applies (IMO we should >>>>>> constrain ourselves to talk about sufficiently spelled out designs - >>>>>> Ian's >>>>>> contract design qualifies and I'd also feel fine with the thing I wrote >>>>>> down in my blog, as long as we agree that its conditional on polishing >>>>>> the >>>>>> "are pseudo-interfaces usable as types" question), but: Given that we >>>>>> have >>>>>> type-parameters, adding that is fairly straightforward in the form of >>>>>> (in >>>>>> the words of my blog post) parametric pseudo-interfaces >>>>>> "convertible{To,From}(T)" and "assignable{To,From}(T)". >>>>>> >>>>>> But yeah, talking about in too much depth here would IMO constitute >>>>>> high-jacking of threads about Ian's design. I'm also totally cool to >>>>>> start >>>>>> a new thread about this after I had time to incorporate your feedback. >>>>>> Unfortunately this isn't my job, so I have to find time between other >>>>>> things :) >>>>>> >>>>>> Anyway. I think I've been ranty enough for today :) >>>>>> >>>>>> On Sunday, September 9, 2018 at 5:21:28 PM UTC-4, Axel Wagner wrote: >>>>>>>> >>>>>>>> I don't think saying that is is productive. contracts are more than >>>>>>>> just "identifiers used as constraints", they are also a syntactic >>>>>>>> construct >>>>>>>> to specify those. I specifically don't allow that and that's the whole >>>>>>>> point I'm making. So this doesn't seem like a particularly nice way to >>>>>>>> have >>>>>>>> a discussion. >>>>>>>> >>>>>>>> But yes, if it makes you happier, we can call them "contracts", >>>>>>>> allow to embed them into interfaces and remove contract declarations >>>>>>>> from >>>>>>>> the design (or, allow embedding interfaces into contract-declarations, >>>>>>>> remove the "type-checking function body" idea and instead define a set >>>>>>>> of >>>>>>>> base-contracts you can use for operators) and you'd end up with pretty >>>>>>>> much >>>>>>>> my design. >>>>>>>> >>>>>>>> On Sun, Sep 9, 2018 at 11:17 PM Jonathan Amsterdam < >>>>>>>> jbams...@gmail.com> wrote: >>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Sunday, September 9, 2018 at 3:19:16 PM UTC-4, Axel Wagner >>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> On Sun, Sep 9, 2018 at 8:49 PM Jonathan Amsterdam < >>>>>>>>>> jbams...@gmail.com> wrote: >>>>>>>>>> >>>>>>>>>>> The problem is that this program seems to type-check, but it is >>>>>>>>>>> invalid. The == operator is specified to work on operands of the >>>>>>>>>>> same type, >>>>>>>>>>> and it is being used on operands of different types. >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Good point. I have to think about it. An ad-hoc solution, FWIW, >>>>>>>>>> would be to only take into account (or allow) pseudo-interfaces for >>>>>>>>>> type-constraints. >>>>>>>>>> >>>>>>>>> >>>>>>>>> The draft design has a name for those: contracts. >>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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 golang-nuts...@googlegroups.com. >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>> -- >>>>>>> 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 golang-nuts...@googlegroups.com. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> -- >>>>> 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 golang-nuts...@googlegroups.com. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> -- >>> 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 golang-nuts...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >>
-- 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 golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.