On 4 September 2018 at 17:53, Tristan Colgate <tcolg...@gmail.com> wrote: > Without though, people maybe encouraged to create getters and setters,which > is very un-Go. > Contracts can match a method explicitly if needed.
Getters and setters are only un-Go if they're used as a matter of course for field values, I think. We already have this issue with interfaces - we don't allow an interface type to specify a field - interfaces only allow methods. By allowing a contract to specify fields, we preclude a wrapper type from adapting some other type to fit the same contract. FWIW the Counters example in the design doc is trivially implementable with interfaces, so I haven't yet seen decent motivation for this. cheers, rog. > > > On Tue, 4 Sep 2018, 17:49 roger peppe, <rogpe...@gmail.com> wrote: >> >> On 4 September 2018 at 17:30, Tristan Colgate <tcolg...@gmail.com> wrote: >> > This would disallow contracts on presence and type of fields right? >> > The existing design permits them, and disallowing them feels a little >> > arbitrary. >> >> It would, yes. But on balance, I think that the presence of selectors >> in contracts makes for them harder to understand. For example, the >> rather arbitrary rules about value methods go away if you don't allow >> selectors. The ambiguity between a field selector and a method >> selector goes away too. For example, the Stringer contract in the >> design doc purports to check that there's a method named String, which >> it does not - it could be a function-valued field instead. >> >> So if you've written something like this: >> >> func FastString(type T stringer)(x T) string { >> switch x.(type) { >> case myType: >> return x.String() >> default: >> // Slow path: fall back to fmt. >> return fmt.Sprint(x) >> } >> } >> >> you might expect that fmt.Sprint will call the String method that's >> defined on x, but that's not guaranteed. >> >> The selector operation does so much work in Go that it's hard to >> classify it as a single operation, and I think that disallowing it >> lets values focus more on behaviour and less on appearance, as >> interfaces do. >> >> > >> > On Tue, 4 Sep 2018, 17:17 roger peppe, <rogpe...@gmail.com> wrote: >> >> >> >> On 4 September 2018 at 15:41, thwd <sedeveloper...@gmail.com> wrote: >> >> > From the draft proposal I gather two open questions: >> >> > - How free or restricted should contract bodies be? >> >> > - How many implicit constraints can be inferred from usage? >> >> > >> >> > If too much syntax is allowed in contract bodies and no implicit >> >> > constraints >> >> > are gathered: >> >> > people will copy and paste function bodies into contracts to cover >> >> > all >> >> > constraints. >> >> > >> >> > If only restricted syntax is allowed in contract bodies and a lot of >> >> > implicit constraints are gathered: >> >> > people will write empty contracts and hope for the compiler to pick >> >> > up >> >> > on >> >> > all the constraints. >> >> > >> >> > These two questions are related. >> >> >> >> As I understand it, if a contract doesn't allow it, you won't be able >> >> to >> >> do it. >> >> That is, the contract is scanned for "operations" (however they might >> >> be >> >> defined), and then it will be a compiler error if a function uses an >> >> operation >> >> not permitted in the contract. >> >> >> >> An empty contract body permits no operations other than those available >> >> on every Go value (copying, taking address of, passing as a parameter, >> >> etc). >> >> >> >> So I'm not entirely sure what you mean by "implicit constraints". >> >> >> >> That said, it is my opinion that it is very hard to read an arbitrary >> >> constraint >> >> body and infer the set of possible operations that can be performed. >> >> It's not that much easier to look at it and work out what types might >> >> satisfy >> >> the contract either. >> >> >> >> My suggestion (that I've written up here: >> >> https://gist.github.com/rogpeppe/45f5a7578507989ec4ba5ac639ae2c69) is >> >> that, at least to start with, we allow only a very restricted set of >> >> contract bodies. >> >> >> >> Specifically, in my suggestion, every statement in a contract body >> >> must consist of exactly one expression. >> >> Identifiers in the expression can only reference types or the >> >> contract's parameters. >> >> The expression must reference at least one of the contract's type >> >> parameters. >> >> The expression must exactly one of: >> >> - any unary or binary operator (but not a field or method selector) >> >> - a function invocation >> >> - a type conversion >> >> - an index expression >> >> >> >> Intuitively I'd like a single statement in the expression to specify >> >> exactly a single operation which should be clear from the operands of >> >> the expression. >> >> >> >> Thus if you look down the contract and you don't see the operation >> >> you're looking for, then you can't do it. >> >> >> >> cheers, >> >> rog. >> >> >> >> -- >> >> 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. -- 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.