On Fri, Sep 11, 2015 at 10:19 AM, Matt Bauman <[email protected]> wrote: > Further, I'm fairly certain that we always evaluate function arguments from > left to right. I think this all comes from the Lisp-y > almost-everything-is-an-expression tradition. >
For positional arguments yes. Didn't include that because of https://github.com/JuliaLang/julia/issues/9535 > > On Friday, September 11, 2015 at 9:51:28 AM UTC-4, 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! >>> >
