i1 : x = new HashTable from { val => 1000, cache => new CacheTable }
o1 = HashTable{cache => CacheTable{}}
val => 1000
o1 : HashTable
|
i2 : f = (t -> (print "hi there"; t.val^4)) o2 = f o2 : FunctionClosure |
i3 : h = (cacheValue VALUE) f o3 = -*a cache function*- o3 : CacheFunction |
i4 : h x hi there o4 = 1000000000000 |
i5 : h x o5 = 1000000000000 |
i6 : peek'_2 x
o6 = HashTable{cache => CacheTable{VALUE => 1000000000000}}
val => 1000
|
../../m2/methods.m2:592:18-601:26: --source code:
cacheValue = key -> f -> new CacheFunction from (x -> (
c := try x.cache else x.cache = new CacheTable;
if c#?key then (
val := c#key;
if class val === CacheFunction then (
remove(c,key);
c#key = val x)
else val
)
else c#key = f x))
The object cacheValue is a function closure.