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