lua - получить список имен параметров функции извне функции

Я генерирую некоторую (не HTML) документацию для библиотеки Lua, которую я разработал. Я буду создавать документацию вручную, но я буду признателен за некоторую автоматизацию, если это возможно (например, создание скелетов для каждой функции, чтобы я мог их заполнить)

Я хотел бы знать, есть ли способ для lua узнать имена параметров, которые принимает функция, вне ее.

Например, есть ли способ сделать это в Lua?

function foo(x,y)
  ... -- any code here
end

print( something ... foo ... something)
-- expected output: "x", "y"

Большое спасибо.

5 ответов

Решение

Взгляни на debug.getinfo, но вам, вероятно, нужен парсер для этой задачи. Я не знаю ни одного способа извлечь параметры функции из Lua, не запустив ее и не проверив ее таблицу окружения (см. debug.debug а также debug.getlocal).

Хорошо, вот основной код:

function getArgs(fun)
local args = {}
local hook = debug.gethook()

local argHook = function( ... )
    local info = debug.getinfo(3)
    if 'pcall' ~= info.name then return end

    for i = 1, math.huge do
        local name, value = debug.getlocal(2, i)
        if '(*temporary)' == name then
            debug.sethook(hook)
            error('')
            return
        end
        table.insert(args,name)
    end
end

debug.sethook(argHook, "c")
pcall(fun)

return args
end

и вы можете использовать так:

print(getArgs(fun))

Попробуйте мою библиотеку инспектора байт-кода. В Lua 5.2 вы сможете использовать debug.getlocal,

      function GetArgs(func)
    local args = {}
    for i = 1, debug.getinfo(func).nparams, 1 do
        table.insert(args, debug.getlocal(func, i));
    end
    return args;
end

function a(bc, de, fg)
end

for k, v in pairs(GetArgs(a)) do
  print(k, v)
end

напечатает

      1   bc
2   de
3   fg

В основном мы используем debug.getinfo получить nparams атрибут (который дает нам информацию о том, сколько параметров принимает функция) и debug.getlocal для доступа к имени параметров.

Протестировано и работает с Lua 5.4

Посмотрите на утилиту luadoc. Это похоже на Doxygen, но для Lua. Он предназначен для того, чтобы документация могла быть написана в соответствии с исходным кодом, но она, безусловно, могла бы использоваться для создания шаблона структуры документации, который должен быть выделен отдельно. Конечно, механизм шаблонов оставит вас с проблемой обслуживания в будущем...

Другие вопросы по тегам