Finish conditional compilation of operators
[fur] / templates / program.c
index e2e553b..897ca5e 100644 (file)
@@ -160,132 +160,18 @@ Object operator$negate(Object input)
   return result;
 }
 
-Object operator$add(Object left, Object right)
+{% for id in infix_declarations %}
+Object operator${{ id.name }}(Object left, Object right)
 {
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
+  assert(left.type == {{ id.in_type.upper() }});
+  assert(right.type == {{ id.in_type.upper() }});
 
   Object result;
-  result.type = INTEGER;
-  result.instance.integer = left.instance.integer + right.instance.integer;
-  return result;
-}
-
-Object operator$subtract(Object left, Object right)
-{
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
-
-  Object result;
-  result.type = INTEGER;
-  result.instance.integer = left.instance.integer - right.instance.integer;
-  return result;
-}
-
-Object operator$multiply(Object left, Object right)
-{
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
-
-  Object result;
-  result.type = INTEGER;
-  result.instance.integer = left.instance.integer * right.instance.integer;
-  return result;
-}
-
-Object operator$integerDivide(Object left, Object right)
-{
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
-
-  Object result;
-  result.type = INTEGER;
-  result.instance.integer = left.instance.integer / right.instance.integer;
-  return result;
-}
-
-Object operator$modularDivide(Object left, Object right)
-{
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
-
-  Object result;
-  result.type = INTEGER;
-  result.instance.integer = left.instance.integer % right.instance.integer;
-  return result;
-}
-
-Object operator$equals(Object left, Object right)
-{
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
-
-  Object result = { BOOLEAN, { left.instance.integer == right.instance.integer } };
-  return result;
-}
-
-Object operator$notEquals(Object left, Object right)
-{
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
-
-  Object result = { BOOLEAN, { left.instance.integer != right.instance.integer } };
-  return result;
-}
-
-Object operator$greaterThan(Object left, Object right)
-{
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
-
-  Object result = { BOOLEAN, { left.instance.integer > right.instance.integer } };
-  return result;
-}
-
-Object operator$lessThan(Object left, Object right)
-{
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
-
-  Object result = { BOOLEAN, { left.instance.integer < right.instance.integer } };
-  return result;
-}
-
-Object operator$greaterThanOrEqual(Object left, Object right)
-{
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
-
-  Object result = { BOOLEAN, { left.instance.integer >= right.instance.integer } };
-  return result;
-}
-
-Object operator$lessThanOrEqual(Object left, Object right)
-{
-  assert(left.type == INTEGER);
-  assert(right.type == INTEGER);
-
-  Object result = { BOOLEAN, { left.instance.integer <= right.instance.integer } };
-  return result;
-}
-
-Object operator$and(Object left, Object right)
-{
-  assert(left.type == BOOLEAN);
-  assert(right.type == BOOLEAN);
-
-  Object result = { BOOLEAN, { left.instance.boolean && right.instance.boolean } };
-  return result;
-}
-
-Object operator$or(Object left, Object right)
-{
-  assert(left.type == BOOLEAN);
-  assert(right.type == BOOLEAN);
-
-  Object result = { BOOLEAN, { left.instance.boolean || right.instance.boolean } };
+  result.type = {{ id.out_type.upper() }};
+  result.instance.{{ id.out_type.lower() }} = left.instance.{{ id.in_type.lower() }} {{ id.operator }} right.instance.{{ id.in_type.lower() }};
   return result;
 }
+{% endfor %}
 
 {% if 'pow' in builtins %}
 Object builtin$pow$implementation(Environment* parent, size_t argc, Object* args)