3

、、をメタテーブルにオーバーロードする__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を変更することはオプションですが、公式リリースを使用できればいいのですが

4

1 に答える 1

5

Lua自体をハッキングせずにはいられません。これらは、C++演算子のオーバーロードのような任意のことを演算子に実行させる方法を意図したものではありません。彼らは彼らが言うことを正確に行うことを目的としています。

そして、Luaはあなたをその約束に留めようとしています。

于 2012-06-08T16:36:46.157 に答える