Re: getting upvalues in current thread's environment?
[
Date Prev][
Date Next][
Thread Prev][
Thread Next]
[
Date Index]
[
Thread Index]
- Subject: Re: getting upvalues in current thread's environment?
- From: Rici Lake <lua@...>
- Date: 2007年1月28日 16:04:41 -0500
On 28-Jan-07, at 3:56 PM, Matthew Armstrong wrote:
Setting the environment explicitly works, but that doesn't really help
me write the tighter syntax that I want.
For instance, this does allow me to use the syntax I want:
function getEnv()
local env = {}
local i = 1
while true do
local localVar, value = debug.getlocal(3, i)
if localVar ~= nil then
env[localVar] = value
else
break
end
i = i + 1
end
setmetatable(env, {__index = _G})
return env
end
function eval(s)
local f = assert(loadstring(s))
setfenv(f, getEnv())
f()
end
function flarp()
local myLocal = "hello"
eval[[print(myLocal)]]
end
flarp()
(prints hello)
... but it uses the debug library and has a nice fat function call
overhead.
... and it wouldn't work if you'd written:
function flarp()
local myLocal = "hello"
return eval[[print(myLocal)]]
end
The simple fact of the matter is that Lua locals are ephemeral
anonymous stack slots. So it's not going to work the way you want it
to, I'm afraid.
(The changed flarp doesn't work because eval is tailcalled, which
allows Lua to recycle the stack frame; consequently, myLocal no longer
exists.)