How can I list modules and check functions exist a

2019-06-23 19:29发布

问题:

Like many "(windows) users" I do not want to spend time learning to compile anything from source. So Lua seems a very good choice for a hobbyist.

Sorry if this is a very simple problem - but...

Q1. How can I list the modules available to any given instance of the interpreter?

Some binary distros have a number of modules compiled as DLLs, and some have them added into the main EXE. It would be nice to know which modules are built in to the EXE, and check the cpath is finding any other DLL modules.

Q2. Is there a way to get help at the command line in Lua?

As I am new to Lua I would like an easy way to get help for any given function. In some interpreted languages there is a help("fname") function, Matlab is a good example.

Q3. Could this function from GSL-Shell be modified as a basis for a help system? (Even if it just confirmed the existence of a given function it would help)

local ffi = require 'ffi'

local help_files = {'graphics', 'matrix', 'iter', 'integ', 'ode', 'nlfit', 'vegas', 'rng', 'fft'}

local cdata_table = {'matrix', 'complex matrix', 'complex'}

local function help_init( ... )
    local REG = debug.getregistry()
    REG['GSL.help_hook'] = {}
end

local function open_module(modname)
    local fullname = string.format('help/%s', modname)
    local m = require(fullname)
    return m
end

local function search_help(func)
    for k, modname in ipairs(help_files) do
        local mt = getmetatable(func)
        local module = open_module(modname)
        if module[func] then
            local help_text = module[func]
            return help_text
        end
    end
end

help_init()

-- declare a global function
function help(x)
    local txt
    if type(x) == 'function' then
        txt = search_help(x)
    elseif type(x) == 'userdata' then
        local mt = getmetatable(x)
        if mt then txt = search_help(mt) end
    elseif type(x) == 'cdata' then
        local cname = gsl_type(x)
        if cname then txt = search_help(cname) end
    end
    --- Could we check that the function exists?
    print(txt or "No help found for the given function")
end

回答1:

Q2: There isn't any standard help feature like that. There have been a couple of efforts to standardize on a documentation format but, to my knowledge, none of them has ever gotten much traction.

Q3: That function could certainly be used as the basis of a help system assuming you had help files set up appropriately.

That being said if you just want to find out what functions are available from a given module you can generally just dump the modules table and find out. See the globals example from the lua demo as an example.