lua-users home
lua-l archive

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


On Tue, Oct 5, 2010 at 3:11 PM, steve donovan <steve.j.donovan@gmail.com> wrote:
On Tue, Oct 5, 2010 at 2:50 PM, Thijs Koerselman
<thijskoerselman@gmail.com> wrote:
> I only know how to do this with setenv, and I'm not sure how to replace it
> with _ENV

AFAIK, it goes like this

local print,tostring = print,tostring -- just like module(), this is a
private environment!
local _ENV = {}

function m1()
...
end

function m2()
...
end

return _ENV

Note that this kind of module has no name - you can put it anywhere in
the filesystem. You have to say 'local m = require 'mod'' because it
does not do any global magic.


Aha so _ENV is implicitly used as the environment for any global variable, and if you re-declare _ENV yourself, like you do above, any global after that automagically ends up in that table. By declaring _ENV as local in a module, all exported names are kept in a local table and are not polluting global namespace. Any function or variable declared local in the module will not appear in the _ENV export table because only the globals end up there.


If I understand this correctly, the above approach is backwards compatible with 5.1 if you add setenv(1, _ENV) after the first line, right? 

Thijs