On Mon, 25 Dec 2000 11:46:11 -0500 "Andrew C. Greenberg" werdna@mucow.com wrote:
That has been the Smalltalk behavior since the dark ages... I presume the intention is to make it semantically similar to assignment expressions, whose value is equal to the assigned value. To achieve your intention, you should evalutae 'abcdef' at: 1 put: $x; yourself which returns the receiver of the first message expression.
Right. Also, if it were otherwise, there would be no way to operate on the expression for the put: operand. #yourself gives access to the receiver, while the returned value gives access to the assigned value.
Why you would want this, rather than to assign the expression to a temporary is beyond me, but hey, syntax like this is what makes obfuscated code contests fun to enter!
One reason is that it doesn't require a temporary, which helps keep the clutter down. Look, for instance at the implementation of #at:ifAbsentPut:
at: key ifAbsentPut: aBlock "Return the value at the given key. If key is not included in the receiver store the result of evaluating aBlock as new value."
^ self at: key ifAbsent: [self at: key put: aBlock value]
which, if #at:put: returned the receiver rather than the second argument, would become
at: key ifAbsentPut: aBlock "Return the value at the given key. If key is not included in the receiver store the result of evaluating aBlock as new value."
| blockResult |
^ self at: key ifAbsent: [self at: key put: (blockResult _ aBlock value). blockResult]
I know which one I perfer. ;-)
Cheers, Bob
squeak-dev@lists.squeakfoundation.org