Re: Capturing Lua variable as a string
Romulo Bahiense <romulo <at> icontroller.com.br>
2007-10-01 11:30:59 GMT
Julien Hamaide wrote:
> Lythoner LY wrote:
>> Hi All,
>>
>> (snip)
>
> if you have a limited number of type, you can define them as global
> variable :
>
> INT = "INT"
> FLOAT = "FLOAT"
>
> function DEF_PARAM(v)
> -- do something here to set NAME property from v
> -- v["NAME"] = ???? How do I get string equivalent of variable v
> return v
> end
>
> Just load this script before your definition file, and TYPE will
> automatically contain the text.
>
>
>
>
I think he meant the name of the variable:
>> In shell,
>>
>>> print(DeviceParam3.NAME)
>> DeviceParam3
>>
>>> print (type(DeviceParam3.NAME)
>> string
Unfortunately, it is not possible to know what is the name of the
variable you are assigning to (inside the DEF_PARAM function, of
course). What I suggest, is to __newindex the chunk's environment and
post-assign the name. Something like:
myconfiguration.lua:
DeviceParam1 = DEF_PARAM{ TYPE = INT }
DeviceParam2 = DEF_PARAM{ TYPE = INT }
DeviceParam3 = DEF_PARAM{ TYPE = INT }
~~ end of myconfiguration.lua:
configloader.lua
function load( filename )
local f = assert( loadfile( filename ) )
local e = setmetatable( {}, {
__index = _G;
__newindex = function( t, k, v )
if type( k ) == 'string' and type( v ) == 'table' then
v.NAME = k
end
end; } )
setfenv( f, e )
f()
end
~~ end of configloader.lua
Of course, this will cause all assignments of tables to global variables
be changed. You can make some tricks to only assign the NAME fields to
a particular subset. First, you can check for the presence of a TYPE
attribute as a pre-condition (trivial). Second, you can store the newly
created table in another table while creating it with DEF_PARAM and then
check if the table being assigned belongs to it:
configloader2.lua
function load( filename )
local f = assert( loadfile( filename ) )
local t = {}
local old_DEF_PARAM = DEF_PARAM
local e = setmetatable(
{
DEF_PARAM = function( info )
-- In case DEF_PARAM creates another table...
info = old_DEF_PARAM( info )
t[ info ] = true
return info
end;
}, {
__index = _G;
__newindex = function( t, k, v )
if t[ v ] then
v.NAME = k
end
end;
}
)
setfenv( f, e )
f()
end
~~ end of configloader2.lua
Hope that helps,
--rb