diff --git a/.idea/tyche.iml b/.idea/tyche.iml
index f08604b..4c94235 100644
--- a/.idea/tyche.iml
+++ b/.idea/tyche.iml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/vm/expr.cc b/src/vm/expr.cc
index 1d32a88..06e1156 100644
--- a/src/vm/expr.cc
+++ b/src/vm/expr.cc
@@ -20,40 +20,75 @@ static int init_ = []() {
#define BIN_OP(op, t1, t2) binary_ops[(size_t) BinaryOperationType::op][(size_t) Type::t1][(size_t) Type::t2] = [](Value const& b, Value const& a)
BIN_OP(Sum, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(Sum, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(Sum, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(Sum, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(Subtraction, Integer, Integer) { return Value::createInteger(a.as_integer() - b.as_integer()); };
+ BIN_OP(Subtraction, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(Multiplication, Integer, Integer) { return Value::createInteger(a.as_integer() * b.as_integer()); };
+ BIN_OP(Multiplication, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(Division, Integer, Integer) { return Value::createFloat((float) a.as_integer() / (float) b.as_integer()); };
+ BIN_OP(Division, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(IntegerDivision, Integer, Integer) { return Value::createInteger(a.as_integer() / b.as_integer()); };
+ BIN_OP(IntegerDivision, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(Equality, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() == b.as_integer()); };
+ BIN_OP(Equality, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(Inequality, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() != b.as_integer()); };
+ BIN_OP(Inequality, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(LessThan, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() < b.as_integer()); };
+ BIN_OP(LessThan, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(LessThanOrEquals, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() <= b.as_integer()); };
+ BIN_OP(LessThanOrEquals, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(GreaterThan, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() > b.as_integer()); };
+ BIN_OP(GreaterThan, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(GreaterThanOrEquals, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() >= b.as_integer()); };
+ BIN_OP(GreaterThanOrEquals, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(BitwiseAnd, Integer, Integer) { return Value::createInteger(a.as_integer() & b.as_integer()); };
+ BIN_OP(Power, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
- BIN_OP(BitwiseOr, Integer, Integer) { return Value::createInteger(a.as_integer() | b.as_integer()); };
-
- BIN_OP(BitwiseXor, Integer, Integer) { return Value::createInteger(a.as_integer() ^ b.as_integer()); };
-
- BIN_OP(Power, Integer, Integer) { return Value::createInteger((int32_t) powl(a.as_integer(), b.as_integer())); };
+ BIN_OP(Modulo, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); };
+ BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); };
+ BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); };
+ BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); };
BIN_OP(ShiftLeft, Integer, Integer) { return Value::createInteger(a.as_integer() << b.as_integer()); };
-
BIN_OP(ShiftRight, Integer, Integer) { return Value::createInteger(a.as_integer() >> b.as_integer()); };
-
- BIN_OP(Modulo, Integer, Integer) { return Value::createInteger(a.as_integer() % b.as_integer()); };
+ BIN_OP(BitwiseAnd, Integer, Integer) { return Value::createInteger(a.as_integer() & b.as_integer()); };
+ BIN_OP(BitwiseOr, Integer, Integer) { return Value::createInteger(a.as_integer() | b.as_integer()); };
+ BIN_OP(BitwiseXor, Integer, Integer) { return Value::createInteger(a.as_integer() ^ b.as_integer()); };
#undef BIN_OP
diff --git a/src/vm/expr.hh b/src/vm/expr.hh
index a0bc4dd..6250812 100644
--- a/src/vm/expr.hh
+++ b/src/vm/expr.hh
@@ -6,8 +6,10 @@ namespace tyche::vm {
enum class BinaryOperationType
{
- Sum, Subtraction, Multiplication, Division, IntegerDivision, Equality, Inequality, LessThan, LessThanOrEquals,
- GreaterThan, GreaterThanOrEquals, BitwiseAnd, BitwiseOr, BitwiseXor, Power, ShiftLeft, ShiftRight, Modulo,
+ Sum, Subtraction, Multiplication, Division, IntegerDivision,
+ Equality, Inequality, LessThan, LessThanOrEquals,
+ GreaterThan, GreaterThanOrEquals, Power, Modulo,
+ BitwiseAnd, BitwiseOr, BitwiseXor, ShiftLeft, ShiftRight,
COUNT
};