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' <main ctx instance>: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 module 'testmodule' return {}