My concern was about a shared ok. On Mon, Dec 25, 2017 at 1:22 PM, <matthewju...@gmail.com> wrote:
> Well my almost-use-case was just for signaling without assignment. The > assignment cases are something that would need to be addressed by such a > feature. I like your pattern as a Go 1 solution, but what are the > unaddressed concerns? > > Thanks for the feedback, happy holidays. > > Matt > > On Sunday, December 24, 2017 at 12:41:04 PM UTC-6, Michael Jones wrote: >> >> Many important concerns are unaddressed here. >> >> Inside the clause of a "v1 := <-c1" the identifier v1 has meaning -- it >> is the value by which one refers to the successful receipt. >> >> Inside the clause of a "v1, ok1 := <-c1" v1 is either the value received >> when ok1 is true or the zero value of the type when ok1 is false. >> >> Having multiple vNs and one Ok feels improper to me. >> >> >> >> How about this as a way to do the "grouped response metaphor" you seek: >> >> var v1, v2, ... vN appropriateValueTypes for channels c1..cN >> var ok1, ok2, ... okN bool >> >> // do the select with all case bodies empty >> select { >> case v1,ok1 = <- c1: >> case v2,ok2 = <- c2: >> : >> case vN,okN = <- cN: >> } >> >> // decode the select >> switch { >> case ok1, ok2: >> // common stuff coded once >> case okN: >> // solo stuff >> } >> >> >> >> On Fri, Dec 22, 2017 at 7:36 AM, <matthe...@gmail.com> wrote: >> >>> David, >>> >>> There's a good argument for not spending time adding this to the spec >>> and compilers: there are bigger issues for the existing language developers. >>> >>> Jason, >>> >>> I've suggested the non-receiving assignment is set to the zero value, ok >>> only applies to the receiving assignment and can be used twice since both >>> are bool, and yes there are a lot of commas. Perhaps there could be special >>> syntax for the multiple ok: >>> >>> select{ >>> case x := <-c1, y := <-c2, (ok): >>> // ok is for whichever is assigned or closed >>> } >>> >>> Maybe living with the commas isn't too bad: >>> >>> select{ >>> case x, ok := <-c1, y, ok := <-c2, z, ok := <-c3: >>> // ok is for whichever is assigned or closed >>> } >>> >>> Or how about ;? Two examples: >>> >>> select{ >>> case x, ok := <-c1; y, ok := <-c2: >>> if ok == false { >>> return >>> } >>> if x != false { >>> fmt.Println("true on c1") >>> break >>> } >>> fmt.Printf("non-zero %v on c2\n", y) >>> case x, ok := <-c3; y, ok := <-c4: >>> if ok == false { >>> return >>> } >>> if x != 0 { >>> fmt.Println(x) >>> } else { >>> fmt.Println(y) >>> } >>> continue >>> case c5<-v1; c6<-v2; c7<-v3: >>> break OUTER >>> } >>> >>> select{ >>> case x, ok := <-c1 >>> y, ok := <-c2: >>> if ok == false { >>> return >>> } >>> if x != false { >>> fmt.Println("true on c1") >>> break >>> } >>> fmt.Printf("%v on c2\n", y) >>> case x, ok := <-c3 >>> y, ok := <-c4 >>> z := <-c8: >>> if ok == false { >>> return >>> } >>> if x != 0 { >>> fmt.Println(x) >>> } else if y != nil { >>> fmt.Println(y) >>> } else { >>> fmt.Println(z) >>> } >>> continue >>> case c5<-v1 >>> c6<-v2 >>> c7<-v3: >>> break OUTER >>> } >>> >>> ok would be set to true if the receiving assignment does not assign it >>> but other parallel assignments have it. >>> >>> Matt >>> >>> >>> On Friday, December 22, 2017 at 12:44:03 AM UTC-6, Jason Phillips wrote: >>>> >>>> Matt, >>>> >>>> Would that mean that other receive expression(s) yield the zero value? >>>> >>>> select { >>>> case x := <-c1, y := <-c2: >>>> // If a value is received from c1, is y the zero value? >>>> } >>>> >>>> Would the multi-valued assignment form of the receive operator gain an >>>> additional meaning? >>>> >>>> select { >>>> case x, ok := <-c1, y := <-c2: >>>> // If a value is received from c2, does "ok" designate >>>> unsuccessful receive or channel close? >>>> } >>>> >>>> Additionally, the commas become awfully confusing with multiple >>>> multi-valued assignments: >>>> >>>> select { >>>> case x, ok1 := <-c1, y, ok2 := <-c2: >>>> // Do something >>>> } >>>> >>>> >>>> Jason >>>> >>>> On Thursday, December 21, 2017 at 2:38:02 PM UTC-5, matthe...@gmail.com >>>> wrote: >>>>> >>>>> I would assume only one would send/receive out of the comma list for a >>>>> case to be executed. >>>>> >>>>> Matt >>>>> >>>>> On Thursday, December 21, 2017 at 12:32:22 PM UTC-6, Jason Phillips >>>>> wrote: >>>>>> >>>>>> With a multiple expression switch statement, the associated case is >>>>>> executed if any expression is equal to the switch expression. For a >>>>>> multiple expression select, would all channel expressions have to proceed >>>>>> for the associated case to execute? >>>>>> >>>>>> e.g. >>>>>> >>>>>> select { >>>>>> case x := <-c1, y := <-c2: >>>>>> // is it guaranteed that both c1 and c2 have produced a value, >>>>>> or just one or the other? >>>>>> } >>>>>> >>>>>> What about send operations? >>>>>> >>>>>> select { >>>>>> case c1 <- 10, c2 <- 20: >>>>>> // is this only executed if both sends happened? >>>>>> } >>>>>> >>>>>> >>>>>> Jason >>>>>> >>>>>> On Thursday, December 21, 2017 at 9:04:35 AM UTC-5, >>>>>> matthe...@gmail.com wrote: >>>>>>> >>>>>>> First the switch behavior surprised me when looking at how to stack >>>>>>> cases, but then later I was surprised that select doesn't have the same >>>>>>> thing. Consistency is the only reason to write it down, my concrete >>>>>>> example >>>>>>> doesn't need this as shown by Damien in the proposal. >>>>>>> >>>>>>> Matt >>>>>>> >>>>>>> On Wednesday, December 20, 2017 at 6:51:36 PM UTC-6, Rob 'Commander' >>>>>>> Pike wrote: >>>>>>>> >>>>>>>> There is no particular reason, it was just to keep things simple, >>>>>>>> if it was even talked about. I don't think it was. >>>>>>>> >>>>>>>> If you want to propose a change, now is a good time to do that. Not >>>>>>>> sure the idea is above the bar, though. >>>>>>>> >>>>>>>> -rob >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Thu, Dec 21, 2017 at 9:39 AM, <matthe...@gmail.com> wrote: >>>>>>>> >>>>>>>>> Tracker proposal for this: https://github.com/golan >>>>>>>>> g/go/issues/23196 >>>>>>>>> >>>>>>>>> Matt >>>>>>>>> >>>>>>>>> On Monday, December 18, 2017 at 10:11:02 AM UTC-6, >>>>>>>>> matthe...@gmail.com wrote: >>>>>>>>>> >>>>>>>>>> I guess with select you can't do the comma for multiple cases >>>>>>>>>> having one behavior like with switch: >>>>>>>>>> >>>>>>>>>> select{ >>>>>>>>>> case <-c1, <-c2: // gofmt: expected 1 expression >>>>>>>>>> fmt.Println("c1 or c2") >>>>>>>>>> case <-c3: >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> switch s{ >>>>>>>>>> case v1, v2: >>>>>>>>>> fmt.Println("v1 or v2") >>>>>>>>>> case v3: >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> I assume this is because select cases have an optional var >>>>>>>>>> assignment. This would have been nice for detecting an explicit >>>>>>>>>> client >>>>>>>>>> cancel action versus a w.(http.CloseNotifier).CloseNotify() >>>>>>>>>> where the resulting server action is the same. >>>>>>>>>> >>>>>>>>>> Matt >>>>>>>>>> >>>>>>>>> -- >>>>>>>>> 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. >>> >> >> >> >> -- >> Michael T. Jones >> michae...@gmail.com >> > -- > 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. > -- Michael T. Jones michael.jo...@gmail.com -- 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.