3

由于 Lua 支持一流的函数,我想知道您是否可以像在许多函数式语言中那样对运算符进行脱糖。例如,在 OCaml 中,您可以执行以下操作:

let x = (+) 3 5

x上面的代码使用 value初始化变量3 + 5。写作(+)相当于有一个本地函数,它接受两个参数并返回它们的总和。(+) 3 5正在使用两个参数3和调用此函数5。这背后的动机是您可以将运算符直接传递给函数,而不必在之前将其包装在函数中:

local t = {"ab", "d", "c" }
local function op_greaterthan (a,b) return a>b end
table.sort (t, op_greaterthan) --would like to write: table.sort (t, (>)) 

谢谢!

4

2 回答 2

4

是的,你可以(我不明白它的意义,它会更慢,但它是可能的):

do
    local mem={}
    function unsugar(op,a,b)

        if mem[op] then
            print('Fetched operation from memory')
            return mem[op](a,b)
        else
            local f=loadstring('local a,b=...; return a '..op..' b')
            mem[op]=f
            return f(a,b)
        end
    end
end
print(unsugar('+',1,2)) -- = 3
print(unsugar('%',5,3)) -- = 2
print(unsugar('%',5,3)) -- = Fetched operation from memory \n 2

编辑:消除了杂散的全局变量 a 和 b,并通过只编译每个操作一次来进行记忆以提高性能。

于 2012-01-16T07:53:04.060 回答
4

你不能。

Lua解释器很小,在处理操作符时“走捷径”;对于解析器,它们根本不是“函数”。

如果您尝试使用没有参数的运算符,如下所示:

f(+)

然后解释器会抛出一个语法错误。

由于这种实现,您仅限于已经讨论过的选项:要么使用包装函数(例如add),要么传入字符串等某种eval,如 jpjacobs 的解决方案。

于 2012-01-16T14:21:33.423 回答