[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: [Proposal] _LOCAL was: Re: how to call a local function by its name?
- From: Coda Highland <chighland@...>
- Date: Mon, 8 Jun 2015 14:40:01 -0700
On Mon, Jun 8, 2015 at 2:09 PM, Soni L. <fakedme@gmail.com> wrote:
>
>
> On 08/06/15 06:05 PM, Soni L. wrote:
>
> I wish you could access your own locals with an _LOCAL[idx] that would be
> faster than debug.getlocal...
>
> Not sure how that'd work if you local x = _LOCAL, or called a function with
> _LOCAL...
>
> Actually I do know, _LOCAL tables would be like any other tables, but
> heavily optimized for this kind of stuff, and it'd be part of the function's
> call stack entry thingy. The GC can take care of the rest.
function locals()
return setmetatable({ [0]={} }, {
__index = function(t, k)
local ki = t[0][k]
assert(ki, "attempt to read nonexistent local")
local ln, lv = debug.getlocal(2, ki)
assert(ln == k, "inconsistent state")
return ln
end,
__newindex = function(t, k, v)
local ki = t[0][k]
if not ki then
local i = 0
while true do
i = i + 1
local ln, lv = debug.getlocal(2, i)
if ln == k then
ki = i
break
elif not ln then
break
end
end
assert(ki, "attempt to assign nonexistent local")
end
debug.setlocal(2, ki, v)
end
})
end
_LOCAL = locals()
Untested... but that's about as good as you're going to get.
/s/ Adam