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是一个选项,但是如果我可以使用正式版本那将是很好的