[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Conceptual problem with module
- From: Chris Marrin <chris@...>
- Date: Tue, 25 Apr 2006 10:36:06 -0700
Diego Nehab wrote:
Hi,
There are two issues here. One is namespace polution. The
other is returning the namespace from require().
In most cases, require *will* return the namespace. Either
your package returns it directly, or it calls module()
(which sets the package.loaded table) and returns nil. In
either case, the namespace will be returned.
Ok, I see my mistake. I understand all the little bits of logic in
ll_require and ll_module now! My problem was that I did a require
"WalkerAI" and a module "ai", so they were not the same!!! That problem
is solved. Thanks.
About the namespace problem, Mildred's solution does the
trick. If you don't want your module to polute the
namespace, set loaded[modname] to the namespace *before*
calling module().
This seems like a fair bit of hackery, especially the 'package.seeall'
function, needed to make the hand-crafted table work like a module.
Rewriting the module function would not be bad, except that it would
break any module that depended on the global behavior.
Adding a package.noglobal function would be nice, then you could go:
module("WalkerAI", package.noglobal)
This function would remove the namespace from the global table. It would
require rewriting of the module function as well, to save the previous
value of the namespace. Something like this might work:
local _module = module
function module(name, ...)
local _G = _G
local package = package
local v = _G[name]
_module(name,...)
if package.loaded[name].__NOGLOBAL ~= nil then
_G[name] = v
end
end
function package.noglobal(m)
m.__NOGLOBAL = true
end
How does that look?
--
chris marrin ,""$,
chris@marrin.com b` $ ,,.
mP b' , 1$'
,.` ,b` ,` :$$'
,|` mP ,` ,mm
,b" b" ,` ,mm m$$ ,m ,`P$$
m$` ,b` .` ,mm ,'|$P ,|"1$` ,b$P ,` :$1
b$` ,$: :,`` |$$ ,` $$` ,|` ,$$,,`"$$ .` :$|
b$| _m$`,:` :$1 ,` ,$Pm|` ` :$$,..;"' |$:
P$b, _;b$$b$1" |$$ ,` ,$$" ``' $$
```"```'" `"` `""` ""` ,P`
"As a general rule,don't solve puzzles that open portals to Hell"'