writeln = function(...) for i, v in pairs({ ... }) do if type(v) == "table" then local t = v if #v == 0 then t = {} for k, v in pairs(v) do table.insert(t, k .. ": " .. v) end end io.write("[ " .. table.concat(t, ", ") .. " ]") else io.write(v) end end io.write("\n") end foo = function(...) print("Called foo ...") for i, arg in pairs({ ... }) do writeln(" args[", i, "] == ", arg) end print("... foo end") end local tup = { 5, 3.14, "hello world", { 5, 10, 15 }, { foo = 5, bar = 10 } } foo(unpack(tup))