private Object EvaluateBinaryOperation(Object left, Object right, BinaryOp.OpType type) { if (left.GetType() != right.GetType()) { return(new Error($@" Unsupported different types in {type} operation left side is a: {left.GetType()} right side is a: {right.GetType()} ")); } if (left.GetType() == Number.Name && right.GetType() == Number.Name) { return(EvaluateNumberOp(left as Number, right as Number, type)); } return(Null.NULL); }
private Object EvaluateNumberOp(Number left, Number right, BinaryOp.OpType type) { switch (type) { case BinaryOp.OpType.Add: return(new Number(left.value + right.value)); case BinaryOp.OpType.Subtract: return(new Number(left.value - right.value)); case BinaryOp.OpType.Divide: return(new Number(left.value / right.value)); case BinaryOp.OpType.Power: return(new Number(Math.Pow(left.value, right.value))); case BinaryOp.OpType.Multiply: return(new Number(left.value * right.value)); case BinaryOp.OpType.Modulo: return(new Number(left.value % right.value)); case BinaryOp.OpType.Equal: return(Boolean.FromBool(left.value == right.value)); case BinaryOp.OpType.GreaterThan: return(Boolean.FromBool(left.value > right.value)); case BinaryOp.OpType.GreaterOrEqual: return(Boolean.FromBool(left.value >= right.value)); case BinaryOp.OpType.LessThan: return(Boolean.FromBool(left.value < right.value)); case BinaryOp.OpType.LessOrEqual: return(Boolean.FromBool(left.value <= right.value)); case BinaryOp.OpType.NotEqual: return(Boolean.FromBool(left.value != right.value)); default: return(new Error($"unsupported operation with numbers: {type}. Consider doing a type transformation")); } }