Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Print all local variables accessible to the current scope in Lua

I know how to print "all" global variables using the following code

for k,v in pairs(_G) do     print("Global key", k, "value", v) end 

So my question is how to do that for all variables that are accessible from the currently executing function, something that can do what locals() does for Python.

like image 644
Edu Felipe Avatar asked May 14 '10 13:05

Edu Felipe


2 Answers

Use debug.getlocal.

like image 35
lhf Avatar answered Sep 28 '22 17:09

lhf


Here is an implementation of a locals() function. It will return a table of locals from the calling scope:

function locals()   local variables = {}   local idx = 1   while true do     local ln, lv = debug.getlocal(2, idx)     if ln ~= nil then       variables[ln] = lv     else       break     end     idx = 1 + idx   end   return variables end 

Notice that in the lua REPL, each line is a separate chunk with separate locals. Also, internal variables are returned (names start with '(' if you want to remove them):

> local a = 2; for x, v in pairs(locals()) do print(x, v) end a   2 (*temporary)    function: 0x10359b38 

Thanks for the accept. You have unlocked the last piece of the puzzle! ;-)

Upvalues are local variables from outer scopes, that are used in the current function. They are neither in _G nor in locals()

function upvalues()   local variables = {}   local idx = 1   local func = debug.getinfo(2, "f").func   while true do     local ln, lv = debug.getupvalue(func, idx)     if ln ~= nil then       variables[ln] = lv     else       break     end     idx = 1 + idx   end   return variables end 

Example (notice you have to use a for it to show up):

> local a= 2; function f() local b = a; for x,v in pairs(upvalues()) do print(x,v) end end; f() a   2 
like image 104
u0b34a0f6ae Avatar answered Sep 28 '22 18:09

u0b34a0f6ae