Desugar Lua运营商

时间:2012-01-16 00:37:01

标签: lua operators syntactic-sugar first-class-functions

由于Lua支持一流的功能,我想知道你是否可以像许多函数式语言一样使用desugar运算符。例如,您可以在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, (>)) 

谢谢!

2 个答案:

答案 0 :(得分: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,并通过仅编译每次操作一次来进行memoizing以提高性能。

答案 1 :(得分:4)

你不能。

Lua解释器非常小,在与操作员打交道时“快捷”;对于解析器,它们根本就不是“函数”。

如果您尝试使用没有params的运算符,请执行以下操作:

f(+)

然后解释器将抛出语法错误。

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