X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=templates%2Fprogram.c;h=c589e048520bb3044beb8307fdf3ad00788c6a2b;hp=e2e553bf4da10b636a89ad52a378d210cde5cb04;hb=80efbcfcd42da6061d0e31add5cc1e6fb17b2f93;hpb=059e6ff380d17a715ffbd2d55ac59e39c931a954 diff --git a/templates/program.c b/templates/program.c index e2e553b..c589e04 100644 --- a/templates/program.c +++ b/templates/program.c @@ -160,60 +160,18 @@ Object operator$negate(Object input) return result; } -Object operator$add(Object left, Object right) +{% for od in operator_declarations %} +Object operator${{ od.name }}(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$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); + assert(left.type == {{ od.input_type.upper() }}); + assert(right.type == {{ od.input_type.upper() }}); 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; + result.type = {{ od.result_type.upper() }}; + result.instance.{{ od.result_type.lower() }} = left.instance.{{ od.input_type.lower() }} {{ od.c_operator }} right.instance.{{ od.input_type.lower() }}; return result; } +{% endfor %} Object operator$equals(Object left, Object right) { @@ -269,24 +227,6 @@ Object operator$lessThanOrEqual(Object left, Object right) 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 } }; - return result; -} - {% if 'pow' in builtins %} Object builtin$pow$implementation(Environment* parent, size_t argc, Object* args) {