lua metatable __lt __le __eq强制返回值的布尔值转换

chr*_* g. 2 lua operator-overloading metatable

重载__eq,__lt__le在元表中总是将返回值转换为布尔值.

有没有办法获取实际的返回值?

这将在下面的小lua脚本中用于为参数创建表达式树

用法:

print(_.a + _.b - _.c * _.d + _.a) 
         -> prints "(((a+b)-(c*d))+a)" which is perfectly what I would like to have
Run Code Online (Sandbox Code Playgroud)

但它不起作用,print(_.a == _.b)因为返回值转换为布尔值

ps:稍后应使用处理表达式树的函数替换print

- 从lua脚本中剪辑 -

function binop(op1,op2, event)
    if op1[event] then return op1[event](op1, op2) end
    if op2[event] then return op2[event](op1, op2) end
    return nil
end

function eq(op1, op2)return binop(op1,op2, "eq") end
...
function div(op1, op2)return binop(op1,op2, "div") end

function exprObj(tostr)
    expr =  { eq = binExpr("=="), lt = binExpr("<"), le = binExpr("<="), add = binExpr("+"), sub=binExpr("-"), mul = binExpr("*"), div= binExpr("/") }
    setmetatable(expr,  { __eq = eq, __lt = lt, __le = le, __add = add, __sub = sub, __mul = mul, __div = div, __tostring = tostr })
    return expr
end

function binExpr(exprType)
    function binExprBind(lhs, rhs)
        return exprObj(function(op) return "(" .. tostring(lhs) ..  exprType .. tostring(rhs) .. ")" end)
    end
    return binExprBind
end

function varExpr(obj, name)
    return exprObj(function() return name end)
end

_ = {}
setmetatable(_, { __index = varExpr })
Run Code Online (Sandbox Code Playgroud)

- 快照 -

修改lua vm是一个选项,但是如果我可以使用正式版本那将是很好的

Nic*_*las 5

不是没有攻击Lua本身.这些并不是为了让运算符能够像C++运算符重载一样执行任意操作; 他们打算完全按照他们的说法去做.

而Lua将会帮助你实现这一承诺.