Hi Phil,
On 12 Nov 2014, at 12:54, phil@highoctane.be wrote:
Looking at LRUCache tests, I've found this:
testFibonacci "After an idea by Jan Vrany. Recursively enter the cache and its access protection"
| fibCache | fibCache := self newCache. fibCache maximumWeight: 32; beThreadSafe; factory: [ :key | key < 2 ifTrue: [ key ] ifFalse: [ (fibCache at: key - 1) + (fibCache at: key - 2) ] ]. self assert: (fibCache at: 40) equals: 102334155
the factory thing basically solves the problem.
Good ;-)
Is there more docs about the caching somewhere? I read the code, comments, and unit tests but still, will value an explanation.
I tried to comment everything, the class comments (check AbstractCache too) are quite extensive. What else do you want to know ?
Keying by object works, but with symbols, it isn't behaving. I think I miss something here.
I don't understand, AFAIK you can use any object as both key and value, most tests use Symbols. Can you elaborate ?
Is the cache size set at a given limit?
I think you are looking for CacheWeight (read the class comment). Basically, a cache has a weight, if it is exceeded, it starts removing items. How you compute the weight is up to you, the default is that each entry has a weight of 1, so you end up counting the entries. But you could use something like file or byte size of the value.
I see keyIndex is Dictionary new. What if I do have a lot of keys? Is the dictionary being copied over and over to get to the right size?
Yes, of course it is a dictionary that grows when needed, what else do you want ? You want to predefine it at a certain size ? Sven PS: BTW, the implementation is slightly more complicated than what you would expect, it uses a double linked list and an index dictionary, to achieve proper O(1) performance in its common operations (accessing, adding & evicting entries).
Phil
Phil
Phil
On Tue, Nov 11, 2014 at 7:52 PM, phil@highoctane.be <phil@highoctane.be> wrote: I should ask more questions :-).
Now, this still doesn't answer the question on how to use this to memoize object methods.
I think that what is closest to what I am looking for is this:
http://wiki.tcl.tk/10779 http://wiki.tcl.tk/10981
I am use we can do something like that in Pharo, with some memoize method in Object playing around with thisContext.
SomeClass>>someMethodWith: aSomething and: aSomethingElse
Like self haltIf: aSymbol will break if aSymbol is in the call stack.
Any guru having a way to do that?
Phil
On Tue, Nov 11, 2014 at 7:21 PM, Torsten Bergmann <astares@gmx.de> wrote: Werner Kassens wrote:
Hi, now this a nice idea, especially the memoizedUsing:cache idea. i would really appreciate it, if that would be MIT licenced. werner
It already is, thanks to the permission of author John Cromartie who answered us today. Both methods are in a slice already:
Details in https://pharo.fogbugz.com/f/cases/14458
Thx T.