That is why this should be tightened down imo. It’s obscure cruft that needs to 
be accounted for when refactoring. 

> On Jan 15, 2020, at 2:23 PM, Tom Payne <t...@tompayne.org> wrote:
> 
> 
> Thanks all for the insight and explanation. Could I suggest tweaking the Go 
> language specification to emphasize the separation, so it reads:
> 
>    "when evaluating the operands of an expression, assignment, or return 
> statement, then all function calls, method calls, and communication 
> operations are evaluated in lexical left-to-right order. Any operands that 
> are variables take the value of the variable after all function calls, 
> methods calls, and communication operations have been evaluated."
> 
> The presence or absence of function calls does make a difference here. In 
> this example the use of the identity() function changes the result of f():
> 
>   func identity(i int) int {
>       return i
>   }
> 
>   func modify(i *int) error {
>       *i = 1
>       return nil
>   }
> 
>   func f() (int, error) {
>       i := 0
>       return identity(i), modify(&i) // returns 0, nil
>   }
> 
> 
>> On Wed, 15 Jan 2020 at 20:50, Robert Engels <reng...@ix.netcom.com> wrote:
>> I disagree here. Knowing the order of operations/evaluation is part of 
>> knowing the language. If that’s the case it should be undefined (which 
>> forces a rewrite) not chose a behavior that seems contrary to the 
>> documentation and common practice in this area. 
>> 
>>>> On Jan 15, 2020, at 1:39 PM, Axel Wagner <axel.wagner...@googlemail.com> 
>>>> wrote:
>>>> 
>>> 
>>> I don't think "clearly this behavior is not what you would want" is a valid 
>>> generalization.
>>> 
>>>   type MyStruct{
>>>       // …
>>>   }
>>> 
>>>   func (x *MyStruct) initialize() error {
>>>       // does some common verification and populates some internal data 
>>> structures
>>>       return nil
>>>   }
>>> 
>>>   func New() (*MyStruct, error) {
>>>       x := &MyStruct{
>>>            // default fields
>>>       }
>>>       return x, x.initialize()
>>>   }
>>> 
>>>   func NewWithFoo(f Foo) (*MyStruct, error) {
>>>        x := &MyStruct{
>>>             Foo: f,
>>>        }
>>>        return x, x.intialize()
>>>   }
>>> 
>>> You can say that you shouldn't do something like this, but it's IMO 
>>> reasonable code to write and it expects different behavior.
>>> 
>>> However, as per my previous e-mail, I would still prefer to rewrite this, 
>>> of course :)
>>> 
>>> 
>>>> On Wed, Jan 15, 2020 at 8:33 PM Robert Engels <reng...@ix.netcom.com> 
>>>> wrote:
>>>> I think the way to look at it is “what would be the behavior of if you 
>>>> were inline creating and initializing a struct containing both values” - 
>>>> clearly this behavior is not what you would want or expect. 
>>>> 
>>>> > On Jan 15, 2020, at 1:25 PM, Paul Jolly <p...@myitcv.io> wrote:
>>>> > 
>>>> > 
>>>> >> 
>>>> >>  "when evaluating the operands of an expression, assignment, or return 
>>>> >> statement, all function calls, method calls, and communication 
>>>> >> operations are evaluated in lexical left-to-right order."
>>>> > 
>>>> > My understanding goes as follows: the operands of the return statement
>>>> > are i and modify(&i). The comma after "return statement" in the above
>>>> > sentence is then important: because the only "function calls, method
>>>> > calls, and communication operations" in that list of operands are (is)
>>>> > modify(&i).
>>>> > 
>>>> > Hence when i (as in the first operand) is evaluated is not specified.
>>>> > And therefore it's dangerous to rely on it being one value or another
>>>> > (which it could be given the example you provide).
>>>> > 
>>>> > There was even some discussion at the London Gophers November 2019
>>>> > meetup (where the conundrum was very related
>>>> > https://docs.google.com/presentation/d/e/2PACX-1vQ07uP_ldnSYzpaNb5AlZZ-_tL2mZuoNfQgxvsTKSM4aglYR-nuvyrZ8nK__r3YQTo1vqH-Hmax3aXs/pub?slide=id.g6239d05d0e_0_1)
>>>> > about whether it would be possible to statically flag potential errors
>>>> > like this.
>>>> > 
>>>> > -- 
>>>> > 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/CACoUkn7KA0Z-TDypdvM%3Du%3DyVPHuHFmtD%3DiTV2c98Vm%3Dqn4NcPw%40mail.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.
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/golang-nuts/9EC93CAE-B11C-45E3-9D01-AC4AE5769BEE%40ix.netcom.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/Q7KVGTFt3nU/unsubscribe.
>> To unsubscribe from this group and all its topics, 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/1388A9A2-F321-459A-893E-6D90D42E7255%40ix.netcom.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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/712CE684-1432-4298-A4EE-91E7B4C89BF4%40ix.netcom.com.

Reply via email to