summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-07-08 00:16:30 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-07-08 00:16:30 +0000
commit7441a0947cada8534adf48fa41e2d4471dfdeffc (patch)
tree3cc0578fc93883ef90ee737866eadfd79074e410 /builtins.c
parente6a38aa97b9de05ae0eede568212667b68784a60 (diff)
Implement the full arithmetic part of the ISO spec.
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c42
1 files changed, 5 insertions, 37 deletions
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