在元表中重载__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 是一个选项,但是如果我可以使用官方版本会很好