As sad as it sounds, inside of me I agree on "it is all moot anyway", 
but... Aren't we allowed to at least freely day-dream anyway :) ? 

I was thinking about it over weekend, and came with these "rules", but I 
need help on these for sure


   1. If expression ends with ? (like func()?) , then it works as return in 
   "if a, err := func(); err != nil { return a, err }"
   2. If it is in the middle of expression ...
   1. without error handled
      
      val := func()?.somethingElse().member
      
      then it just expanded to a 
      
      val := (type(member))nil
      if tmp, err := func(); tmp == nil || err != nil {
          val = tmp.somethingElse().member
      }
      
      just saving the embarrassment of nil pointer dereference.
      
      2. with an error on the left side
      
      val, err := func()?.somethingElse()
      
      then it is expanded to 
      
      val := (type(somethingElse())nil
      var err error
      if tmp, err := func(); if err == nil && tmp != nil {
          val, err = tmp.somethingElse()
      }
         
      3. If error manipulation required - use a regular "if err != nil { 
   return _, wrap(err, "bad thing happen") }   

I am probably overthinking it at this point (and it is way past bedtime), 
but maybe it might make sense to have 2 different constructs - one for 
nil-guard "?" and one for "check for nil AND error", thus becoming "??" 
With that logic above, the following should make some sense

type Mood interface {
    frolic()
    avoided() Mood
    passed() (Mood, error)
}

func getMood() (Mood, error) {...}

func usage1() (Mood, error) {
   return getMood()??.passed()
}

func usage2() error {
   return getMood()??.passed()
}

func usage3() interface{} {
    return getMood()?.avoided()
}

func usage4() (interface{}, error) {
    mood := getMood()??   /// will short-circuit if getMood() returns an 
error
    return mood?.passed() // guard for mood == nil; but will return no 
error in that case either since it will be nil
}

Andrey


On Tuesday, July 2, 2019 at 12:10:20 AM UTC-6, Liam wrote:
>
> Erm, what expression besides a function call would yield an error only 
> sometimes? I suppose channel receive, but is that a useful case?
>
> It's all moot anyway.
>
> On Mon, Jul 1, 2019, 10:42 PM Andrey Tcherepanov <xnow4f...@sneakemail.com 
> <javascript:>> wrote:
>
>> Thanks Liam,
>>
>> your suggested placement would make it somehow impossible (or at least I 
>> cannot see it right now) to use with someExpression?.someMember
>> If I am not mistaken, yours is close to the currently proposed "try", 
>> just replacing it with ?, am I right on that ?
>>
>> A.
>>
>> On Monday, July 1, 2019 at 2:49:09 AM UTC-6, Liam wrote:
>>>
>>> I've noted in several places that a 'try' expression (via keyword, 
>>> built-in, or symbol) is suitable only when the function is expected to 
>>> always succeed, and so would panic on error.
>>>
>>> Also the symbol, which I agree is preferable, works best this way 
>>> will?(always?(work?())) vs will(always(work()?)?)?
>>>
>>> On Saturday, June 29, 2019 at 4:05:44 PM UTC-7, Michael Jones wrote:
>>>>
>>>> My personal thought, though it may seem strange, is that the best 
>>>> argument for it lies in the single word sentence at the bottom of your 
>>>> email. You write "Thoughts?" -- and that is very expressive in English in 
>>>> just the way that you mean above in your examples. I don't know enough 
>>>> other languages to really know if the parallels are universal, but it's 
>>>> pretty clear to me what it means why "file?.close()" and 
>>>> "os.Open(filename)?" are "punctuated" as they are -- where the question 
>>>> is. 
>>>> I feel like you're asking this compiler, "is there anything about this 
>>>> value that you need to tell me?" I like that.
>>>>
>>>> The long (crazy long!) discussion of error handling has among its many 
>>>> branches an analysis from the Go team about '?' and this kind of postfix 
>>>> interrogation. I'm watching it all with a bit of wonder, but I wanted to 
>>>> speak up and say how your human-language phrasing matches your idea of 
>>>> computer-language phrasing. That seems a powerful kind of naturalness to 
>>>> take advantage of in this issue and future ones.
>>>>
>>>> On Sat, Jun 29, 2019 at 2:56 PM Andrey Tcherepanov <
>>>> xnow4f...@sneakemail.com> wrote:
>>>>
>>>>> Hello mighty fighters of errors!
>>>>>
>>>>> Here comes my half-thought idea of another way to express error 
>>>>> handling:
>>>>>
>>>>> *Add a postfix '?' that checks value for **emptiness (nil, 0, "") **AND 
>>>>> an error for nil. *
>>>>>
>>>>> (Denis have shred it to pieces already in 
>>>>> https://github.com/golang/go/issues/32852. Thank you Denis.)
>>>>>
>>>>> I am not good with expressing my inner talk, so there are couple 
>>>>> examples
>>>>>
>>>>> original , Go 1 function
>>>>>
>>>>> func stat(filename string) (os.FileInfo, error) {
>>>>>
>>>>> var info os.FileInfo
>>>>> {
>>>>> var a1 *os.File
>>>>> if a1, err := os.Open(filename); err != nil || a1 == nil {
>>>>> return _, err
>>>>> }
>>>>> var a2 os.FileInfo
>>>>> if a2, err := a1.Stat(); err != nil || a2 == nil {
>>>>> return _, err
>>>>> }
>>>>> info = a2
>>>>> }
>>>>>         return info, nil
>>>>> }
>>>>>
>>>>>
>>>>> And with "?", trying to avoid original try() proposal handle leak
>>>>>
>>>>> // would return _, err, but since there is no err in signature, will 
>>>>> return default value in case of error
>>>>> // uses ? on func call that returns (value, error)
>>>>> func stat2(filename string) (os.FileInfo) {
>>>>>      file := os.Open(filename)? 
>>>>>      defer file.Close()
>>>>>      return file.Stat()?
>>>>> }
>>>>> // would return error too, uses ? as "not nil" on a variable too
>>>>> func stat3(filename string) (_ os.FileInfo, err error) {
>>>>>      var file *os.File
>>>>>      defer file?.Close()
>>>>>      file := os.Open(filename)?
>>>>>      return file.Stat()
>>>>> }
>>>>>
>>>>>
>>>>> Thoughts?
>>>>>
>>>>> -- 
>>>>> 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 golan...@googlegroups.com.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/golang-nuts/b7520ffe-ec38-4157-8f95-92844dcb0d0f%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/golang-nuts/b7520ffe-ec38-4157-8f95-92844dcb0d0f%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>
>>>> -- 
>>>>
>>>> *Michael T. jonesmichae...@gmail.com*
>>>>
>>> -- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "golang-nuts" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/golang-nuts/-lmobOi3p5s/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> golan...@googlegroups.com <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/93987580-3f1d-4ab8-b796-2e095d49a3b4%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/93987580-3f1d-4ab8-b796-2e095d49a3b4%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> 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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/b6257202-4a4e-4dd8-ab8b-7fcbfaf448d6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to