去糖化 Lua 运算符

由于 Lua 支持一级函数,我想知道是否可以像许多函数式语言一样去除操作符。例如,在 OCaml 中,你可以这样做:

let x = (+) 3 5

上面的代码将变量 x 初始化为 3 + 5 的值。写 (+) 等同于有一个本地函数,它接受两个参数并返回它们的总和。(+) 3 5 是用这两个参数 35 调用此函数。 背后的动机是,你可以直接将运算符传递给函数,而无需在函数之前将其包装在函数中:

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, (>))

感谢!

原文链接 https://stackoverflow.com/questions/8874676

点赞
stackoverflow用户513763
stackoverflow用户513763

是的,你可以这么做(我不明白这样做的意义,并且它会变得更慢,但是这是可能的):

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

        if mem[op] then
            print('从内存中获取操作')
            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)) -- = 从内存中获取操作 \n 2

编辑:消除公共 a 和 b,加入 memoizing 来提高性能,只编译每个操作一次。

2012-01-16 07:53:04
stackoverflow用户312586
stackoverflow用户312586

你不行。

Lua 解释器非常小,对于操作符它“使用快捷方式”,对于解析器而言,它们只是没有“函数”。

如果你尝试在不带参数的情况下使用运算符,就像这样:

f(+)

那么解释器将会抛出语法错误。

由于这种实现方式,你只能使用已经讨论过的选项:要么使用包装函数(如 add),要么传入字符串并进行某种类似于 jpjacobs' 解决方案的“评估”。

2012-01-16 14:21:33