func either(c bool, a, b func() string) string {
    if c {
        return a()
    }
    return b()
}

func thunk(s string) func() string {
    return func() string { return s }
}

fmt.Printf("color is %s", either(temperature > 100, thunk("red"),
thunk("blue"))

</troll> ;)

On Thu, Aug 16, 2018 at 10:53 AM roger peppe <rogpe...@gmail.com> wrote:

> In my experience, this is rarely a real pain, and where it is, a
> simple function can help out.
>
>     func either(condition bool, a, b string) string {
>         if condition {
>             return a
>         }
>         return b
>     }
>
>     fmt.Printf("color is %s", either(temperature>100, "red", "blue"))
>
> The runtime cost for simple cases is exactly the same as if it had
> been built into the language. (If you wish to rely on the lazy
> evaluation of the values with respect to the condition, I suspect that
> an if statement would be more appropriate anyway.
>
> On 16 August 2018 at 09:11, 'Axel Wagner' via golang-nuts
> <golang-nuts@googlegroups.com> wrote:
> > Hi Sam. A couple small responses inline.
> >
> > On Thu, Aug 16, 2018 at 8:13 AM Sam Vilain <s...@vilain.net> wrote:
> >>
> >> To me the biggest reason to want a ternary operator is to make it easier
> >> on the reader of the code.  If there's anything that go and python have
> in
> >> common, it's that both languages are designed to be easy to read (though
> >> with notable differences in emphasis about what makes it easy), and also
> >> relatively easy to tell whether code is correct.
> >
> >
> > I am not particularly familiar with the design process of Python. But
> > judging from the result, I find that very hard to believe, TBQH. I find
> both
> > of these things - reading Python and telling whether Python code is
> correct
> > - to be very hard things to do. ISTM that if two processes claim to
> optimize
> > for the same thing but achieve such different results, then either they
> > weren't optimizing for the same thing, or one of the two failed. I'm
> > uncomfortable claiming the latter, so I'd personally argue the former:
> That
> > it may be worth considering that we should use different words for what
> > Python aims for and what Go aims for (not that I have good suggestions).
> >
> >> With a ternary, it's very clear that after the statement, the assignment
> >> has occurred.
> >>
> >> result = test ? "a" : "b"
> >>
> >> With an `if' statement, you have to read a bit more:
> >>
> >> var result string
> >> if test {
> >>   result = "a"
> >> } else {
> >>   result = "b"
> >> }
> >>
> >> In most cases the analysis is very simple to tell that both code
> branches
> >> assign to `result'.  But there's a problem with this.  This is only
> easy to
> >> see if someone doesn't then come along and insert extra code into those
> nice
> >> welcoming code blocks:
> >>
> >> var result string
> >> if test {
> >>   result = "a"
> >>   // insert code here
> >>   funcCall()
> >> } else {
> >>   // insert other code here
> >>   funcCall2()
> >>   result = "b"
> >> }
> >>
> >> As a result, as the code is modified, the condition that 'result has a
> >> value' is not held and you end up with the zero value instead of
> something
> >> you expected.
> >
> >
> > I don't understand what you mean. Your code seems fine, what am I
> > overlooking?
> >
> > On a larger point: I don't believe this to be a good argument. I'd argue
> > that if the logic of the latter is what you want, you will get there,
> > ternary expression or not. I'd argue that in practice, if you started
> with a
> > ternary expression, people would just remove that and write the code you
> > ended up with anyway. Because they want that logic and writing that
> > conditional statement is the way to achieve that logic.
> >
> > But I'm not clairvoyant, so who knows what would happen in actual
> practice.
> >
> >>
> >>
> >> Of course it's not as bad as in python or C because there is a separate
> >> `=' and `:=' operator, but as you can see above, this doesn't always
> come
> >> into play.  If you're assigning more than just an immediate constant,
> you
> >> probably don't want to start with `:=' and then re-assign based on the
> >> conditional.
> >>
> >> It also gets much more complicated to follow for cases where you might
> >> want to use a nested or chained ternary expression, or a more
> complicated
> >> value construction which has many ternaries within it.
> >>
> >> I've lost count of the times I've had to change:
> >>
> >> return FooBar{
> >>     Field: blah,
> >> }
> >>
> >> To:
> >>
> >> var foo FooBar
> >> if someCond {
> >>     foo.Field = blah
> >> } else {
> >>     foo.Field = bar
> >> }
> >> return foo
> >>
> >> In my experience code is clearer and easier to read if it does *not*
> >> contain re-assignments and branches, and temporary variables used only
> once.
> >> With a ternary operator, you can code like that for cases where it makes
> >> sense.  I would much rather write:
> >>
> >> return FooBar{
> >>     Field: someCond ? blah : bar,
> >> }
> >>
> >> my 2¢,
> >> Sam
> >>
> >>
> >> On Wed, Aug 15, 2018 at 1:13 AM, 'Axel Wagner' via golang-nuts
> >> <golang-nuts@googlegroups.com> wrote:
> >>>
> >>> In my opinion Python serves as a poor argument here. I tend to use
> Python
> >>> as a example of a grab-bag language that adds any feature anyone
> considers
> >>> useful - without considering the cost. An Anti-Go, if you will :)
> >>> Gustavo Niemeyer actually wrote this up pretty well:
> >>>
> https://blog.labix.org/2012/06/26/less-is-more-and-is-not-always-straightforward
> >>>
> >>> So, from my perspective, if you tell me "Python did not have ternary
> >>> operators, but after long and hard discussions, they caved", what I'm
> >>> hearing is "even Python didn't really need them". ;)
> >>>
> >>> (Disclaimer: This isn't meant as a dig at Python. I think Python is a
> >>> great language. But its design goals are very different from Go's)
> >>>
> >>> On Wed, Aug 15, 2018 at 8:33 AM Sam Vilain <s...@vilain.net> wrote:
> >>>>
> >>>> I haven't seen all the discussion referenced, but I remember digging
> >>>> deep into the python language archives where Guido and others
> eventually
> >>>> relented and added ternaries (with the syntax "a if val else b"). I
> can't
> >>>> remember the argument which swung the consensus but the arguments
> against
> >>>> seem remarkably similar.
> >>>>
> >>>> Go does have a one-line ternary:
> >>>>
> >>>> var result = map[bool]string{false: "a", true: "b"}[test]
> >>>>
> >>>> It's less of a hack if you declare the lookup "table" separately.
> >>>>
> >>>> Sam
> >>>>
> >>>> On Aug 14, 2018 9:52 PM, Agniva De Sarker <
> agniva.quicksil...@gmail.com>
> >>>> wrote:
> >>>>
> >>>> Your answer is here -
> >>>> https://tip.golang.org/doc/faq#Does_Go_have_a_ternary_form.
> >>>>
> >>>>
> >>>> On Tuesday, 14 August 2018 22:13:37 UTC+5:30, Mark Volkmann wrote:
> >>>>
> >>>> I’m new to Go and I imagine the idea of adding a ternary operator to
> Go
> >>>> has been discussed many times. Rather than repeat that, can someone
> point me
> >>>> to a discussion about why Go doesn’t add this? I’m struggling to
> understand
> >>>> why it is desirable to write code like this:
> >>>>
> >>>> var color
> >>>> if temperature > 100 {
> >>>>     color = “red”
> >>>> } else {
> >>>>     color = “blue”
> >>>> }
> >>>>
> >>>> Instead of this:
> >>>>
> >>>> var color = temperature > 100 ? “red” : “blue”
> >>>>
> >>>> Is the ternary really so confusing that it justifies writing 6 lines
> of
> >>>> code instead of 1? I realize I could eliminate two lines like the
> following,
> >>>> but this isn’t a good idea if the values come from function calls
> since
> >>>> there would sometimes be needless function calls.
> >>>>
> >>>> var color = “blue”
> >>>> if temperature > 100 {
> >>>>     color = “red”
> >>>> }
> >>>>
> >>>> ---
> >>>> R. Mark Volkmann
> >>>> Object Computing, Inc.
> >>>>
> >>>> --
> >>>> 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.
> >>>
> >>> --
> >>> 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.
>

-- 
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.

Reply via email to