Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.676.mcz
==================== Summary ====================
Name: Kernel-eem.676 Author: eem Time: 28 March 2012, 6:31:09.818 pm UUID: 54422144-91c1-4c63-9fbe-8acb5733e35f Ancestors: Kernel-eem.675
Neater simpler, correct implementtion of #once for the current Squeak closure implemenation which lacks clean blocks.
=============== Diff against Kernel-eem.675 ===============
Item was removed: - ----- Method: BlockClosure>>becomeCached (in category 'private') ----- - becomeCached - self become: ((CachedBlockClosure new: self size) - outerContext: outerContext - startpc: startpc - numArgs: numArgs - cachedValue: self value - copiedValues: self)!
Item was removed: - ----- Method: BlockClosure>>becomeUncached (in category 'private') ----- - becomeUncached - "The receiver is already uncached." - ^self!
Item was changed: ----- Method: BlockClosure>>once (in category 'evaluating') ----- once + "Evaluate the receiver exactly once, so that repeated evaluations + answer exactly the same object as the first evaluation. This + allows one to intern values with the idiom - "Answer and remember my value, answering exactly the same object in any further sends - of once or value until I become uncached. This allows one to intern values with the idiom myResourceMethod + ^[expression] once" + + | cache | + cache := self method + propertyValueAt: #onceCache + ifAbsent: [self method propertyValueAt: #onceCache put: Dictionary new]. + ^cache at: startpc ifAbsentPut: [self value]! - ^[expression] once. - The expression will be evaluated once and its result returned for any subsequent evaluations. - Originally by Travis Griggs, from whom we copy this idea with thanks." - numArgs ~= 0 ifTrue: - [self error: 'once should only be used with niladic blocks']. - self becomeCached. - ^self once!
Item was removed: - BlockClosure variableSubclass: #CachedBlockClosure - instanceVariableNames: 'cachedValue' - classVariableNames: '' - poolDictionaries: '' - category: 'Kernel-Methods'! - - !CachedBlockClosure commentStamp: 'eem 7/22/2010 12:34' prior: 0! - I'm a BlockClosure with an added instance variable for storing the once upon a time result of evaluating myself when I was simple BlockClosure. This is triggered by sending #once to a normal BlockClosure. Future sends of once will simply return this value rather than evaluate myself. When sent value, I revert back to a BlockClosure. Originally by Travis Griggs, from whom we copy this idea with thanks. - - Instance Variables - cachedValue <Object> - - cachedValue - - result of having sent value to myself when i was just a BlockClosure!
Item was removed: - ----- Method: CachedBlockClosure>>becomeCached (in category 'private') ----- - becomeCached - "The receiver is already cached." - ^self!
Item was removed: - ----- Method: CachedBlockClosure>>becomeUncached (in category 'private') ----- - becomeUncached - self become: (BlockClosure - outerContext: outerContext - startpc: startpc - numArgs: numArgs - copiedValues: self)!
Item was removed: - ----- Method: CachedBlockClosure>>once (in category 'evaluating') ----- - once - ^cachedValue!
Item was removed: - ----- Method: CachedBlockClosure>>outerContext:startpc:numArgs:cachedValue:copiedValues: (in category 'initialize-release') ----- - outerContext: aContext startpc: aStartpc numArgs: argCount cachedValue: aValue copiedValues: anArrayOrNil - cachedValue := aValue. - super outerContext: aContext startpc: aStartpc numArgs: argCount copiedValues: anArrayOrNil!
Item was removed: - ----- Method: CachedBlockClosure>>value (in category 'evaluating') ----- - value - ^cachedValue!
squeak-dev@lists.squeakfoundation.org