Lua变长函数参数为nil

时间:2016-08-03 16:30:14

标签: lua null functional-programming variadic-functions

我想在lua 5.2中写一个curry function。我的代码如下所示:

function add(a, b)
    return a + b
end

function curry(func, value)
    return (function (...)
        return func(value, table.unpack(arg))
    end)
end

add2 = curry(add, 2)

print(add2(3))

但参数arg不包含传递给add2函数的值。

当我尝试从Lua documentation运行示例时出现错误,因为arg为nil。

printResult = ""

function print (...)
  for i,v in ipairs(arg) do -- arg is nil
    printResult = printResult .. tostring(v) .. "\t"
  end
  printResult = printResult .. "\n"
end

如果不起作用,如何在5.2中使用可变长度函数?

编辑:

正如用户@siffiejoe指出的那样,我的功能只是部分应用,而不是正确的currying。这是我使用接受的答案中的错误修复在lua中实现正确的curry函数。

function curry(func, params)        
    return (function (...)
        local args = params or {}        
        if #args + #{...} == debug.getinfo(func).nparams then
            local args = {table.unpack(args)}
            for _,v in ipairs({...}) do
                table.insert(args, v)
            end
            return func(table.unpack(args))
        else
            local args = {table.unpack(args)}
            for _,v in ipairs({...}) do
                table.insert(args, v)
            end
            return curry(func, args)
        end
    end)
end

随意suggest changes and add test cases here

1 个答案:

答案 0 :(得分:6)

由于Lua 5.1,此上下文中的arg已被...取代(除了后者是列表而不是表)。

因此,table.unpack(arg)应该只是...

Breaking Changes。 Lua参考手册非常好,特别是这一部分非常有用。