-- Auto generate begin
BaseClass = {}
function BaseClass:new(object)
object = object or {}
setmetatable(object, self)
self.__index = self
return object
end
setmetatable(_G, {
__newindex = function(t, k, v)
BaseClass[k] = v
end,
__index = function(t, k)
return BaseClass[k]
end
})
-- Auto generate end
function PrintX(self)
setenv(1, self)
print (x)
end
-- Auto generate begin
setmetatable(_G, nil)
-- Auto generate end
and then a test file that uses it
variable1 = BaseClass:new()
variable2 = BaseClass:new()
variable1.x = 10
variable1:PrintX()
variable2:PrintX()
Basically anything within the --autogenerate comments would be written by a pre-processor macro, so end users could write code, and anything within a file would automatically be added to a class.
if you take a look inside the printX function i'm trying to set the current global environment to self, that is while the function is executing x should reference self.x (The setenv function would be added by a pre-processor as well).
However when i run this piece of code i get the following output attempt to call global 'setenv' (a nil value)
I think this is because instead of calling _G.setenv my code is actually calling BaseClass.setenv, but rawget(_G, "setenv") return nil
Any ideas on how to solve this issue?
EDIT, 2 things
First, i had a typo. It's setfenv not setenv.
Second the following code fails (I'm using the command line interpreter from the lua site)
function test()
local newgt = {}
setmetatable(newgt, {__index = _G})
setfenv(1, newgt)
end
function test()
local newgt = {}
setmetatable(newgt, {__index = _G})
setfenv(1, newgt)
end