[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Bug in Lua 5.3? (was Re: Non-uniqueness of module names)
- From: Sean Conner <sean@...>
- Date: Sun, 21 Apr 2019 17:18:06 -0400
It was thus said that the Great Coda Highland once stated:
> On Sat, Apr 20, 2019 at 5:33 PM Sean Conner <sean@conman.org> wrote:
> > It was thus said that the Great Coda Highland once stated:
> >
> > > the import name always matches the directory containing the module. The
> >
> > Again, pretty much the same as Lua.
>
> Pretty much, but not entirely. The fact that some modules don't do this is
> one of the reasons this thread has come up at all.
That's more an issue for Lua 5.1 than 5.2+.
>
> > > import scheme also does aggressive namespacing so you have to go out of
> > > your way to do stuff that might screw up some other module's transitive
> > > dependencies.
> >
> > Okay, so how does *this* work then?
>
> Mostly, ironclad module scoping. Each file has its own global scope, and
...
> Duplicated dependencies don't necessarily even get mapped onto each other.
> If they're not the same module (with compatibility determined by the
> importer's explicitly-requested versioning information) then you can
> actually end up with two copies of the module loaded in, and since they're
> different modules with isolated namespaces they don't interfere with each
> other. It's not the BEST solution to dependency hell because it leads to
> bloating and bugfixes that don't get applied consistently, but it does mean
> that a transitive dependency is a little less likely to screw you over.
So basically, version numbers are checked when loading modules. I thought
Lua could do this for C-based modules. From the manual:
package.config
A string describing some compile-time configurations for
packages. This string is a sequence of lines:
...
The fifth line is a mark to ignore all text after it
when building the luaopen_ function name. Default is '-'.
...
The name of this C function is the string "luaopen_"
concatenated with a copy of the module name where each dot
is replaced by an underscore. Moreover, if the module name
has a hyphen, its suffix after (and including) the first
hyphen is removed. For instance, if the module name is
a.b.c-v2.1, the function name will be luaopen_a_b_c.
So in trying this, I created the following:
prog.lua
local a = require "a"
local b = require "b"
a.foo()
b.foo()
a.lua
local mod = require "mod-1.2.3"
return {
foo = function()
print('This is module a')
mod.foo()
end
}
b.lua
local mod = require "mod-2.0.1"
return {
foo = function()
print('This is module b')
mod.foo()
end
}
mod-v1.2.3.c
#include <lua.h>
static int foo(lua_State *L)
{
lua_getglobal(L,"print");
lua_pushliteral(L,"This is module mod-1.2.3");
lua_call(L,1,0);
return 0;
}
int luaopen_mod(lua_State *L)
{
lua_createtable(L,0,1);
lua_pushcfunction(L,foo);
lua_setfield(L,-2,"foo");
return 1;
}
mod-2.0.1.c
#include <lua.h>
static int foo(lua_State *L)
{
lua_getglobal(L,"print");
lua_pushliteral(L,"This is module mod-2.0.1");
lua_call(L,1,0);
return 0;
}
int luaopen_mod(lua_State *L)
{
lua_createtable(L,0,1);
lua_pushcfunction(L,foo);
lua_setfield(L,-2,"foo");
return 1;
}
What I expected to see was:
This is module a
This is module mod-1.2.3
This is module b
This is module mod-2.0.1
But what I got was:
lua: ./a.lua:2: module 'mod-v1.2.3' not found:
no field package.preload['mod-v1.2.3']
no file '/home/spc/.luarocks/share/lua/5.3/mod-v1/2/3.lua'
no file '/home/spc/.luarocks/share/lua/5.3/mod-v1/2/3/init.lua'
no file '/home/spc/.luarocks/lib/lua/5.3/mod-v1/2/3.lua'
no file '/home/spc/.luarocks/lib/lua/5.3/mod-v1/2/3/init.lua'
no file '/usr/local/share/lua/5.3/mod-v1/2/3.lua'
no file '/usr/local/share/lua/5.3/mod-v1/2/3/init.lua'
no file '/usr/local/lib/lua/5.3/mod-v1/2/3.lua'
no file '/usr/local/lib/lua/5.3/mod-v1/2/3/init.lua'
no file './mod-v1/2/3.lua'
no file './mod-v1/2/3/init.lua'
no file '/home/spc/.luarocks/lib/lua/5.3/mod-v1/2/3.so'
no file '/usr/local/lib/lua/5.3/mod-v1/2/3.so'
no file '/usr/local/lib/lua/5.3/loadall.so'
no file './mod-v1/2/3.so'
no file '/home/spc/.luarocks/lib/lua/5.3/mod-v1.so'
no file '/usr/local/lib/lua/5.3/mod-v1.so'
no file '/usr/local/lib/lua/5.3/loadall.so'
no file './mod-v1.so'
stack traceback:
[C]: in function 'require'
./a.lua:2: in main chunk
[C]: in function 'require'
prog.lua:3: in main chunk
[C]: in ?
Am I doing something wrong? Is Lua doing something wrong? You can tell I
was confused because one module is "mod-v1.2.3" and the other one is
"mod-2.0.1". In thinking about this further, even if this did work, it
wouldn't necessarily work on all systems for the same reason the exported
function from C modules isn't just "luaopen()" (because some (IMHO)
braindead systems can't deal with loading dynanic linked object with the
same exports).
-spc (Confused by all this)