From 7441a0947cada8534adf48fa41e2d4471dfdeffc Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Thu, 8 Jul 2021 00:16:30 +0000 Subject: Implement the full arithmetic part of the ISO spec. --- builtins.c | 42 +++++------------------------------------- 1 file changed, 5 insertions(+), 37 deletions(-) (limited to 'builtins.c') diff --git a/builtins.c b/builtins.c index 95b6438..885db3c 100644 --- a/builtins.c +++ b/builtins.c @@ -475,37 +475,6 @@ builtincopyterm(Term *goal, Binding **bindings, Module *module) return unify(term2, t, bindings); } -#define ToFloat(t) (t->tag == IntegerTerm ? (double)t->ival : t->dval) - -Term * -aritheval(Term *expr) -{ - /* Not every arithmetic operation is defined right now. */ - - if(expr->tag == FloatTerm || expr->tag == IntegerTerm) - return expr; - else if(expr->tag == CompoundTerm && expr->arity == 2){ - Term *A = aritheval(expr->children); - Term *B = aritheval(expr->children->next); - Term *result = mkinteger(0); - - if(A == nil || B == nil) - return nil; - if(runestrcmp(expr->text, L"+") == 0){ - if(A->tag == IntegerTerm && B->tag == IntegerTerm){ - result->tag = IntegerTerm; - result->ival = A->ival + B->ival; - }else{ - result->tag = FloatTerm; - result->dval = ToFloat(A) + ToFloat(B); - } - }else - return nil; - return result; - }else - return nil; -} - int builtinis(Term *goal, Binding **bindings, Module *module) { @@ -513,12 +482,11 @@ builtinis(Term *goal, Binding **bindings, Module *module) Term *result = goal->children; Term *expr = result->next; - - Term *realresult = aritheval(expr); - if(realresult) - return unify(result, realresult, bindings); - else - return 0; + int waserror; + Term *realresult = aritheval(expr, &waserror); + if(waserror) + Throw(realresult); + return unify(result, realresult, bindings); } int -- cgit v1.2.3