Re-reading the SO-post and answers a little more carefully, I think my earlier statement on C++ is incorrect. The Julia example was copied straight out of my REPL, though, so that's definitely how this works on this end :)
// T On Friday, September 11, 2015 at 3:51:28 PM UTC+2, Tomas Lycken wrote: > > In Julia, this is actually more consistent than in C++, although I think > it's more by chance than by design. > > Since `a * b` expands to `*(a, b)`, *all* operands of the multiplication > will be evaluated before the multiplication operation, regardless of their > order. Thus, if evaluating `b´ modifies `a`, then `a` will be passed > modified into the multiplication method. Demo: > > ``` > julia> type Foo x end > julia> import Base: * > julia> *(x::Foo, y::Foo) = x.x * y.x > * (generic function with 287 methods) > julia> f!(foo) = (foo.x *= 2; foo) > f! (generic function with 1 method) > julia> a = Foo(1); f!(a) * a > 4 > julia> a = Foo(1); a * f!(a) > 4 > ``` > > In C++, on the other hand, `*` is an operator *member* of the first > operand, which leads to the different behavior. > > // T > > On Friday, September 11, 2015 at 3:24:54 PM UTC+2, Yichao Yu wrote: >> >> On Fri, Sep 11, 2015 at 3:44 AM, <[email protected]> wrote: >> > This question on Stackoverflow >> > >> http://stackoverflow.com/questions/32504524/is-value-of-xfx-unspecified-if-f-modifies-x >> >> > was asked for C++ recently. I think it makes sense to ask it for Julia, >> too, >> > given its pass-by-sharing and we-are-all-consenting-adults semantics, >> and I >> > was wondering what the answer is. Of course I can test it on an >> example, but >> > I was wondering if this detail is defined explicitly in the >> > specifications/docs. >> >> In julia, every objects are passed by reference so I don't think >> this would be a problem. The compiler will not make a copy of an >> object and pass it as the argument unless it is an immutable (in which >> case f(x) cannot modify x). >> >> > >> > Thanks! >> > >> >
