2
在metatable中重载__eq
,__lt
和__le
总是将返回值转换为布尔值。lua metatable __lt __le __eq返回值的强制布尔转换
有没有办法访问实际返回值?
这将在下面的小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:打印应后用函数处理所述表达式树
取代 - SN从Lua脚本IP -
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虚拟机是一个选项,但是这将是很好,如果我可以用一个正式发布
你可能会对[MetaLua](http://metalua.luaforge.net/index.html)感兴趣,它允许添加新的操作符。 – jpjacobs