Да, для функций Lua, но не для функций C. Это немного мучительно и немного отрывочно.
debug.getlocal
работает с вызываемыми функциями, поэтому вам нужно вызвать соответствующую функцию. Он не показывает подсказки ...
, если вызов не передает достаточно параметров. Код ниже пытается 20 параметров.
debug.sethook
с событием "call" дает возможность перехватить функцию, прежде чем она выполнит какой-либо код.
Этот алгоритм работает с Lua 5.2. Старые версии будут похожи, но не одинаковы:
assert(_VERSION=="Lua 5.2", "Must be compatible with Lua 5.2")
Небольшой вспомогательный итератор (может быть встроен для эффективности):
local function getlocals(l)
local i = 0
local direction = 1
return function ()
i = i + direction
local k,v = debug.getlocal(l,i)
if (direction == 1 and (k == nil or k.sub(k,1,1) == '(')) then
i = -1
direction = -1
k,v = debug.getlocal(l,i)
end
return k,v
end
end
Возвращает подпись (но может возвратить счетчик параметров и использует вместо нее Varargs):
local function dumpsig(f)
assert(type(f) == 'function',
"bad argument #1 to 'dumpsig' (function expected)")
local p = {}
pcall (function()
local oldhook
local hook = function(event, line)
for k,v in getlocals(3) do
if k == "(*vararg)" then
table.insert(p,"...")
break
end
table.insert(p,k) end
debug.sethook(oldhook)
error('aborting the call')
end
oldhook = debug.sethook(hook, "c")
-- To test for vararg must pass a least one vararg parameter
f(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
end)
return "function("..table.concat(p,",")..")"
end