[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Soliciting criticism of memoize function
- From: "Peter Cawley" <lua@...>
- Date: Fri, 16 May 2008 19:27:39 +0100
Gé Weijers: It doesn't check that f takes a single argument
2008/5/16 Gé Weijers <ge@weijers.org>:
> Is there anything wrong with the following:
>
> local function memoize(f)
> local function index(t, x)
> local v = f(x)
> t[x] = v
> return v
> end
>
> local cache = setmetatable({}, {__mode = 'k', __index = index})
>
> return function(x)
> return cache[x]
> end
> end
>
>
> On May 14, 2008, at 6:40 PM, Norman Ramsey wrote:
>
>> I would be pleased if readers of this list could think of any improvements
>> to the following memoize function:
>>
>> function memoize (f)
>> -- f must take at most one argument and return at most one result
>> local cache = setmetatable({ }, { __mode = 'k' })
>> local function update(x, v, ...) -- f(x) returns v, ...
>> assert(select('#', ...) == 0)
>> cache[x] = v
>> return v
>> end
>>
>> return function (x, ...)
>> assert(select('#', ...) == 0) -- cache works with at most
>> one arg
>> local v = cache[x]
>> if v ~= nil then
>> return v
>> else
>> return update(x, f(x))
>> end
>> end
>> end
>>
>> I'm especially concerned whether I have the cache's __mode metamethod
>> set correctly, as I always get confused about the semantics of weak
>> keys and weak values.
>>
>>
>> Norman
>
> --
> Gé Weijers
> ge@weijers.org
>
>
>
>