lua-users home
lua-l archive

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

On Tue, Oct 5, 2010 at 4:05 PM, Mark Hamburg <> wrote:
> Better to not muck with environments at all. The following works just fine
> in Lua 5.1 and 5.2:

In recent code I've gone for this style as well - straightforward, no magic.

> If you insist on mucking with the global environment, you can always add:
> _G[ ... ] = M

That's cute, but it will only work for top-level modules.

Here's something that does work with any dotted namespace, plus an
option to switch it off. It's meant to replace the 'return M' at the
end of a module.

---- split a string into a list of strings separated by a delimiter.
function split(s,re)
    local res = {}
    re = '[^'']+'
    for k in s:gmatch(re) do t_insert(res,k) end
    return res

local function export(name,mod)
    local rawget,rawset = _G.rawget,_G.rawset
    if not rawget(_G,'__PRIVATE_REQUIRE') then
        local path = split(name,'%.')
        local T = _G
        for i = 1,#path-1 do
            local p = rawget(T,path[i])
            if not p then
                p = {}
            T = p
    return mod

return export(...,M)

Probably evil, but works predictably on both lua 5.1 and 5.2, pleasing
most factions. It is of course something that goes in some utility

steve d.