3

在元表中重载__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

但它不起作用,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 })

- 折断 -

修改 lua vm 是一个选项,但是如果我可以使用官方版本会很好

4

1 回答 1

5

并非没有入侵 Lua 本身。这些并不是让操作符做任意事情的方法,比如 C++ 操作符重载;他们打算完全按照他们所说的去做。

Lua 会让你信守这个承诺。

于 2012-06-08T16:36:46.157 回答