lua-users home
lua-l archive

Re: Capturing Lua variable as a string

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


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

AltStyle によって変換されたページ (->オリジナル) /