diff options
Diffstat (limited to 'builtins.c')
-rw-r--r-- | builtins.c | 42 |
1 files changed, 5 insertions, 37 deletions
@@ -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 |