It also seems to make sense to me that .+= and friends apply in place. The only issues I can think about are when relying on the possibility of mutating the type of the original container, either because of element type promotion, or shape promotion (broadcasting) or container type promotion (e.g. sparse+full) or any combination of the above. I suspect these are minor issues.
On Thursday, May 1, 2014 10:17:27 PM UTC+2, Tim Holy wrote: > > On Thursday, May 01, 2014 01:34:41 PM Stefan Karpinski wrote: > > It occurs to me that now that we separate .+ from + it may make sense > for x > > .+= y to be allowed to mutate x. After all, you are saying that you > expect > > an array in some sense. > > If that's safe, I'd love it. > > --Tim > > > > On May 1, 2014, at 1:25 PM, Patrick O'Leary > > > <[email protected]<javascript:>> > > > > wrote: > > > > > > A longish discussion of pros, cons, and other things can be found in > this > > > issue: > > > > > > https://github.com/JuliaLang/julia/issues/249 > > > > > >> On Thursday, May 1, 2014 11:39:14 AM UTC-5, Dominique Orban wrote: > > >> I would have expected b .+= 5 to change b in place, but it doesn't > seem > > >> to be the case. Isn't it counter-intuitive that it would also make a > > >> copy?>> > > >>> On Thursday, May 1, 2014 6:54:10 AM UTC-7, Freddy Chua wrote: > > >>> do this > > >>> > > >>> b = [1:5] > > >>> f(x) = x + 5 > > >>> map!(f, b) > > >>> > > >>>> On Thursday, May 1, 2014 9:03:35 PM UTC+8, Kevin Squire wrote: > > >>>> b[:] = b .+ 5 > > >>>> > > >>>> has the behavior that you want. However, it creates a copy, does > the > > >>>> addition, then copies the result back into b. > > >>>> > > >>>> So, looping (aka devectorizing) would generally be faster. For > simple > > >>>> expressions like these, though, the Devectorize.jl package should > > >>>> allow you to write > > >>>> > > >>>> @devec b[:] = b .+ 5 > > >>>> > > >>>> It then rewrites the expression as a loop. It isn't able to > recognize > > >>>> some expressions, though (especially complex ones), so YMMV. > > >>>> > > >>>> (Actually, it may not work with ".+", since that is a relatively > new > > >>>> change in the language. If you check and it doesn't, try submitting > a > > >>>> github issue, or just report back here.) > > >>>> > > >>>> Cheers! Kevin > > >>>> > > >>>>> On Thursday, May 1, 2014, Kaj Wiik <[email protected]> wrote: > > >>>>> OK, thanks, makes sense. But how to change the original instance, > is > > >>>>> looping the only way? > > >>>>> > > >>>>> On Thursday, May 1, 2014 3:12:51 PM UTC+3, Freddy Chua wrote: > > >>>>> b = b .+ 5 > > >>>>> > > >>>>> creates a new instance of an array, so the original array pointed > to > > >>>>> by "b" is not changed at all. > > >>>>> > > >>>>> > > >>>>> > > >>>>> On Thursday, May 1, 2014 7:39:14 PM UTC+8, Kaj Wiik wrote: > > >>>>> As a new user I was surprised that even if you change the value of > > >>>>> function arguments (inside the function) the changes are not > always > > >>>>> visible outside but in some cases they are. > > >>>>> > > >>>>> Here's an example: > > >>>>> > > >>>>> function vappu!(a,b) > > >>>>> > > >>>>> a[3]=100 > > >>>>> b = b .+ 5 > > >>>>> (a,b) > > >>>>> > > >>>>> end > > >>>>> > > >>>>> c = [1:5] > > >>>>> d = [1:5] > > >>>>> > > >>>>> vappu!(c,d) > > >>>>> ([1,2,100,4,5],[6,7,8,9,10]) > > >>>>> > > >>>>> c > > >>>>> > > >>>>> 5-element Array{Int64,1}: > > >>>>> 1 > > >>>>> 2 > > >>>>> > > >>>>> 100 > > >>>>> > > >>>>> 4 > > >>>>> 5 > > >>>>> > > >>>>> d > > >>>>> > > >>>>> 5-element Array{Int64,1}: > > >>>>> 1 > > >>>>> 2 > > >>>>> 3 > > >>>>> 4 > > >>>>> 5 >
