Перегрузка __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: печать следует заменить позже функцией, обрабатывающей дерево выражений
-- вырезка из 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 IS вариант, однако было бы неплохо, если бы я мог использовать официальный выпуск