This is cool indeed.

I find an unlimited cache a bit coarse, would not really work in practice. What 
about

memoizedUsing: cache
  ^ [ :x | cache at: x ifAbsentPut: [ self value: x ] ]

then you could pass in a tuned LRUCache instance, among others.

Sven

> On 11 Nov 2014, at 16:24, Torsten Bergmann <asta...@gmx.de> wrote:
> 
> Phil wrote:
>> thanks for the pointer.
>> Now, how do I use that?
> 
> 
> First: create a method BlockClosure>>#memoized in your Pharo image (see 
> https://gist.github.com/jcromartie/2705526)
> 
> memoized
> "returns memoized version of an unary function"
> | cache |
> cache := Dictionary new.
> ^ [ :x | cache at: x ifAbsentPut: [ self value: x ] ]!
> 
> 
> So the idea of #memoized is to return a new "outer" block who evaluates the 
> original block only when the computation 
> of the inner block was not yet done/the result of the inner evaluation is not 
> yet cached. 
> 
> 
> As you see from the comment it works for "unary functions" which would mean 
> it works
> for "one argument blocks". Simple example:
> 
> |square memo |
> square:= [:x | Transcript show: 'Processing'. x * x].
> memo := square memoized.
> memo value: 2. 
> memo value: 3.
> memo value: 2. 
> 
> The Transcript only shows "Processing" two times instead of three times, so 
> only for the first two #value: calls
> we have to calculate x * x.
> 
> For the last evaluation on the memo block (with argument 2 again) the result 
> is already known from the cache, 
> so the square block is not evaluated again. Instead the cached result could 
> be returned which could be faster
> than doing the computation again.
> 
> x*x is only an example - this "memoization" can usually speed up when a block 
> is costly (performancewise) and
> is often called with the same arguments. A precondition (for this caching) is 
> that the block evalutes the 
> same way/returns the same result for the same input argument.
> 
> 
> You also try the two prepared workspaces in Pharo:
> 
> Non-memoized version: http://ws.stfx.eu/5ZE87XSFL9IH
> Memoized Version: http://ws.stfx.eu/QLQLSLT7PZ4C
> 
> Hope this makes it more clear. This simple example is a nice performance 
> trick and shows again the power 
> of Smalltalk and block closures.
> 
> Dont know about the license - but we could ask author John Cromartie for MIT 
> license to include this simple
> method into the standard image. I will try to contact him.
> 
> Bye
> T.
> 


Reply via email to