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