I agree, Henrik. I view this scenario as synonomous as the behavior of the expression (i++) in c++. Could we consider that evaluating an expression creates a temp closure of virtual bindings, based on precedence rules?
How about: | m n | n _ 2. m _ 3. n _ (m _ n) + m
??
What would C++ or Java do in the original example? How about Haskell?
addVectors(m, m = n);
with addVectors(Vector x, Vector y); // like squeak or addVectors(Vector& x, Vector& y); // oops
It seems that we have implicit pass-by-value, since we don't even have references!
rob
-----Original Message----- From: Henrik Gedenryd [mailto:h.gedenryd@open.ac.uk] Sent: Wednesday, January 09, 2002 2:08 PM To: squeak-dev Subject: Re: [OT] Writing a parser for BASIC in Smalltalk/Squeak ? (<CSOTD> included)
Tim Rowledge wrote:
Indeed. I wonder if this behaviour is actually defined
somewhere? It's at
least counter-intuitive.
[snips]
| m n | n _ 2. m _ 3. n _ m + (m _ n)
That's a very polite way of putting it!
Looking at the bytecodes of the method clearly show why it
happens and
I think it must count as a pretty nasty bug.
Sorry, I must protest. This is entirely to be expected, as this is "call-by-value" or whatever is the proper name, as vs. call-by-reference or some such. A variable holding an integer refers to that integer object, which is pushed, then another integer object is pushed when that has become the new value of the variable.
Henrik
squeak-dev@lists.squeakfoundation.org