lua metatable __lt __le __eq принудительное логическое преобразование возвращаемого значения

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


person chris g.    schedule 08.06.2012    source источник
comment
Вас может заинтересовать MetaLua, который позволяет (среди прочего) добавлять новые операторы.   -  person jpjacobs    schedule 09.06.2012


Ответы (1)


Не без взлома самого Lua. Они не предназначены для того, чтобы заставить операторы делать произвольные вещи, такие как перегрузка операторов C++; они предназначены делать именно то, что говорят.

И Lua заставит вас выполнить это обещание.

person Nicol Bolas    schedule 08.06.2012