Greetings,
The basic dependency example from "Smalltalk By Example" uses Visualworks changed:with and update:with:from: methods like this:
price: aPrice | oldPrice | oldPrice := self price. price := aPrice. self changed: #price with: oldPrice
update: aSymbol with: oldPrice from: aStock (aSymbol == #price) ifTrue: [Transcript cr; show: thisContext; tab; show: aSymbol; tab; nextPutAll: 'Price changed from: '; show: oldPrice; tab; nextPutAll: 'To: '; show: aStock price; flush]
The problem is that Squeak only implements update:with: so the aStock price messaging doesn't work. My solution was to follow VW's implementation by making the following changes:
Modified the changed:with: method to include from:.
changed: anAspect with: anObject self dependents do: [:aDependent | aDependent update: anAspect with: anObject from: self]
Added an update:with:from: method.
update: anAspect with: anObject from: aSender ^ self update: anAspect with: anObject
It took a while to see the problem and without looking at VW, I never would have been able to figure a way. Is my fix reasonable?
VW also implements expressInterestIn:for:sendBack: and onChangeSend:to: methods. Anyone familiar with them and care to provide pointers on the possibility of implementing something similar in Squeak?
Thanks, Chris
What about using the methods: #triggerEvent:with: and #when:send:to:
obj when: #price send: #updatePrice: to: anObject2
obj triggerEvent: #price with: oldPrice
where
Object2>>updatePrice: aPrice
Hilaire
Chris Kassopulo a écrit :
Greetings,
The basic dependency example from "Smalltalk By Example" uses Visualworks changed:with and update:with:from: methods like this:
price: aPrice | oldPrice | oldPrice := self price. price := aPrice. self changed: #price with: oldPrice
update: aSymbol with: oldPrice from: aStock (aSymbol == #price) ifTrue: [Transcript cr; show: thisContext; tab; show: aSymbol; tab; nextPutAll: 'Price changed from: '; show: oldPrice; tab; nextPutAll: 'To: '; show: aStock price; flush]
The problem is that Squeak only implements update:with: so the aStock price messaging doesn't work. My solution was to follow VW's implementation by making the following changes:
Modified the changed:with: method to include from:.
changed: anAspect with: anObject self dependents do: [:aDependent | aDependent update: anAspect with: anObject from: self]
Added an update:with:from: method.
update: anAspect with: anObject from: aSender ^ self update: anAspect with: anObject
It took a while to see the problem and without looking at VW, I never would have been able to figure a way. Is my fix reasonable?
VW also implements expressInterestIn:for:sendBack: and onChangeSend:to: methods. Anyone familiar with them and care to provide pointers on the possibility of implementing something similar in Squeak?
Thanks, Chris
Beginners mailing list Beginners@lists.squeakfoundation.org http://lists.squeakfoundation.org/mailman/listinfo/beginners
I was reading Smalltalk by Example yesterday and I had the exact same problem as Chris.
I did some exploring of Object's dependency protocol and rewrote the methods like this:
MyStock>>price: aPrice price := aPrice. self changed: #price with: self
MyStockWatcher>>update: aSymbol with: aStock Transcript cr; print: thisContext; tab; print: aSymbol; tab. aSymbol == #price ifTrue: [ Transcript nextPutAll: 'Price changed to: '; print: aStock price]. Transcript flush.
This works like a charm. But I am passing the parent rather then just the old value because I don't want to store the parent as an instance variable. Is that a bad thing to do? I'm not sure ... still learning right from wrong. :) I don't like it as much as what is in the book because I don't feel I should have to store either the parent or the old value in an instance variable... it seems less elegant.
Seeing Hilaire's explication of the the events protocol, I read through the events protocol and rewrote the methods as such:
MyStock>>price: aPrice price := aPrice. self triggerEvent: #price with: self
MyStockWatcher>>initialize: aStock aStock when: #price send: #updatePrice: to: self
MyStockWatcher>>updatePrice: aStock Transcript cr; print: thisContext; tab; nextPutAll: 'Price changed to: '; print: aStock price; flush.
This works; but, I am still not passing the old value as well. For anyone reading this: any comments on style for doing it this way?
Thanks!
On May 31, 2006, at 14:18, Hilaire Fernandes wrote:
What about using the methods: #triggerEvent:with: and #when:send:to:
obj when: #price send: #updatePrice: to: anObject2
obj triggerEvent: #price with: oldPrice
where
Object2>>updatePrice: aPrice
Hilaire
Chris Kassopulo a écrit :
Greetings,
The basic dependency example from "Smalltalk By Example" uses Visualworks changed:with and update:with:from: methods like this:
price: aPrice | oldPrice | oldPrice := self price. price := aPrice. self changed: #price with: oldPrice
update: aSymbol with: oldPrice from: aStock (aSymbol == #price) ifTrue: [Transcript cr; show: thisContext; tab; show: aSymbol; tab; nextPutAll: 'Price changed from: '; show: oldPrice; tab; nextPutAll: 'To: '; show: aStock price; flush]
The problem is that Squeak only implements update:with: so the aStock price messaging doesn't work. My solution was to follow VW's implementation by making the following changes:
Modified the changed:with: method to include from:.
changed: anAspect with: anObject self dependents do: [:aDependent | aDependent update: anAspect with: anObject from: self]
Added an update:with:from: method.
update: anAspect with: anObject from: aSender ^ self update: anAspect with: anObject
It took a while to see the problem and without looking at VW, I never would have been able to figure a way. Is my fix reasonable?
VW also implements expressInterestIn:for:sendBack: and onChangeSend:to: methods. Anyone familiar with them and care to provide pointers on the possibility of implementing something similar in Squeak?
Thanks, Chris
Beginners mailing list Beginners@lists.squeakfoundation.org http://lists.squeakfoundation.org/mailman/listinfo/beginners
Beginners mailing list Beginners@lists.squeakfoundation.org http://lists.squeakfoundation.org/mailman/listinfo/beginners
-- Shawn MacIntyre Edmonton, Alberta, Canada
beginners@lists.squeakfoundation.org