Hans Hagen wrote: > On 7-5-2010 10:52, Taco Hoekwater wrote: >> Peter Münster wrote: >>> On Thu, May 06 2010, Hans Hagen wrote: >>> >>>>> \startbuffer[test] >>>>> bla = nil >>>>> \stopbuffer >>>>> \savebuffer[test][../mytest.lua] >>>>> \starttext >>>>> \startluacode >>>>> package.path = "../?.lua;;" >>>>> require("mytest") >>>>> \stopluacode >>>>> \stoptext >>>> dofile "../mytest.lua" >>> >>> Bad example... >>> >>> mytest.lua is a module, so it must be loaded with require: >> >> You cannot always replace 'require' with 'dofile', and for >> this reason it is important that package.path actually works >> as explained in the lua manual. (escrito had similar problems, >> and other external lua modules will run into it as well). > > well, package path is supported (as is cpath) so it's more a question of > why that paths fails .. maybe we need to explicitly assume ";" instead > of the platform separator (tests on my machine work ok as windows has ; > as separator) > > you can test this with adding an explcit ";" to > > libpaths = file.split_path(_path_,";") > > in data-lua.lua For me on linux, this change should make it work (package.path indeed contains semicolons). However, require() is still broken: ! LuaTeX error /opt/tex/texmf-local/tex/context/base/l-file.lua:133: bad argument #1 to 'gsub' (string expected, got nil) stack traceback: [C]: in function 'gsub' /opt/tex/texmf-local/tex/context/base/l-file.lua:133: in function 'split_path' /opt/tex/texmf-local/tex/context/base/data-lua.lua:36: in function 'clibpaths' /opt/tex/texmf-local/tex/context/base/data-lua.lua:97: in function [C]: in function 'require'
:2: in main chunk. }inserted text> ...equire('testmodule') -- fails \dodostartluacode ...d \directlua \zerocount {#1}} l.5 \stopluacode Test files are attached. The definition of package.libpaths I used: function package.libpaths() print (_path_, package.path) if not _path_ or package.path ~= _path_ then _path_ = package.path libpaths = file.split_path(_path_,';') print (table.serialize(libpaths)) end return libpaths end And it prints out: nil ./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua t={ "./?.lua", "/usr/local/share/lua/5.1/?.lua", "/usr/local/share/lua/5.1/?/init.lua", "/usr/local/lib/lua/5.1/?.lua", "/usr/local/lib/lua/5.1/?/init.lua", } But it looks like mkiv is not happy with the split path, as it goes on trying clibpaths(). Also, I ran into another problem: if the module has the same name as the base input file, package.libpaths is not called at all (initially the module was called 'tryme.lua'). Best wishes, Taco