Hi Tobias:
My 'hard to find bug' statement should really have read 'hard to find bug from
a newbie perspective'. These bugs would be obvious to someone familiar with
basic programming. My numpy example is too big to give now but here is a simple
metropolis hasting markov chain short example:
theta_curr = 0.0
for k=1:10_000
theta_prop = theta_curr
theta_prop += randperturbation()
likelihoodratio = computelr(theta_prop, theta_curr)
if rand() < minimum([1,likelihoodratio])
theta_curr = theta_prop
else
theta_curr = theta_curr
end
end
The variable theta_prop is only supposed to be set to theta_curr if the first
conditional is true. I guess in python += acts inplace, so that line 3 actually
changes theta_curr, which would be a bug. In my numpy excursion, once I
realized this (after many more lines of code) my stomach turned and I suddenly
decided I didn't know what the heck I was doing and ended up running back to
safe matlab. I had a similar feeling with vec(a) where after learning the
output was the same as input I suddenly had to review all my code that used
vec(a) to make sure I wasn't spuriously fusing variables. The thing about Julia
that I like is that I could start out reasoning about code immediately (if I
avoided functions with ! at the end) and then slowly venture into the more
modern techniques....but the point is I was scientifically productive immediate
without knowing much about programing.
I definitely agree that the suffix "!" works well. In fact I like it so much I
was just hoping that there would be something similar to indicate when output
shared input member. I was thinking there would be reshape(A,dims),
reshape!(A,dims) and reshape*(A,dims) where reshape(A,dims) returned a copy,
reshape!(A,dims) mutated A and reshape*(A,dims) left the arguments alone but
returned a variable which shared memory with A. Anyway, that suggestion now
seems silly after hearing Tim say that there are really only corner, easy to
understand, cases where I need to worry about it.
Again, thanks all for the discussion!
Ethan