diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-27 16:41:12 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-27 16:41:12 +0000 |
commit | 13efe91101a11f41caf6321a8b2fbdd96ef9927a (patch) | |
tree | 4444bb78783fda4d815a4ec91f44052e0de27383 /builtins.c | |
parent | 4fba3e66dce0d167d2031a0d1f1f6f4571cbd981 (diff) |
remove clausenr from terms, and put it into goals instead. Next up is implementing the control constructs in C, since they misbehave right now due to the new changesHEADfront
Diffstat (limited to 'builtins.c')
-rw-r--r-- | builtins.c | 99 |
1 files changed, 12 insertions, 87 deletions
@@ -20,7 +20,6 @@ BuiltinProto(builtintrue); BuiltinProto(builtinfail); BuiltinProto(builtincall); -BuiltinProto(builtincut); BuiltinProto(builtinvar); BuiltinProto(builtinatom); BuiltinProto(builtininteger); @@ -36,7 +35,6 @@ BuiltinProto(builtinuniv); BuiltinProto(builtincopyterm); BuiltinProto(builtinis); BuiltinProto(builtincatch); -BuiltinProto(builtinthrow); BuiltinProto(builtinsetprologflag); BuiltinProto(builtincurrentprologflags); BuiltinProto(builtinopen); @@ -101,8 +99,6 @@ findbuiltin(Term *goal) return builtinfail; if(Match(L"call", 1)) return builtincall; - if(Match(L"!", 0)) - return builtincut; if(Match(L"var", 1)) return builtinvar; if(Match(L"atom", 1)) @@ -133,8 +129,6 @@ findbuiltin(Term *goal) return builtinis; if(Match(L"catch", 3)) return builtincatch; - if(Match(L"throw", 1)) - return builtinthrow; if(Match(L"$set_prolog_flag", 2)) return builtinsetprologflag; if(Match(L"current_prolog_flags", 1)) @@ -241,21 +235,6 @@ canbecalled(Term *t) return 1; } -void -updateclausenr(Term *t, uvlong nr) -{ - /* Change the clause number on the term and its subterms, unless it is a variable */ - if(t->tag == VariableTerm) - return; - - t->clausenr = nr; - if(t->tag == CompoundTerm){ - Term *child; - for(child = t->children; child != nil; child = child->next) - updateclausenr(child, nr); - } -} - int builtincall(Term *goal, Binding **bindings, Module *module) { @@ -265,27 +244,7 @@ builtincall(Term *goal, Binding **bindings, Module *module) if(!canbecalled(callgoal)) Throw(typeerror(L"callable", callgoal)); - updateclausenr(callgoal, clausenr); - clausenr++; - - goalstack = addgoals(goalstack, callgoal, module); - return 1; -} - -int -builtincut(Term *goal, Binding **bindings, Module *module) -{ - USED(bindings); - USED(module); - - Choicepoint *cp = choicestack; - - /* Cut all choicepoints with an id larger or equal to the goal clause number, since they must have been introduced - after this goal's parent. - */ - while(cp != nil && cp->id >= goal->clausenr) - cp = cp->next; - choicestack = cp; + goalstack = addgoals(goalstack, callgoal, module, clausenr++); return 1; } @@ -563,7 +522,7 @@ builtinuniv(Term *goal, Binding **bindings, Module *module) list = list->children->next; for(i = 1; i < len; i++){ - Term *t = copyterm(list->children, nil); + Term *t = copyterm(list->children); elems = appendterm(elems, t); list = list->children->next; } @@ -575,7 +534,7 @@ builtinuniv(Term *goal, Binding **bindings, Module *module) Term *reallist = mklist(elems); return unify(list, reallist, bindings); }else{ - Term *t = copyterm(term, nil); + Term *t = copyterm(term); t->next = mkatom(L"[]"); Term *reallist = mkcompound(L".", 2, t); return unify(list, reallist, bindings); @@ -588,8 +547,8 @@ builtincopyterm(Term *goal, Binding **bindings, Module *module) USED(module); Term *term1 = goal->children; Term *term2 = term1->next; - Term *t = copyterm(term1, &clausenr); - clausenr++; + Term *t = copyterm(term1); + renametermvars(t); return unify(term2, t, bindings); } @@ -623,44 +582,11 @@ builtincatch(Term *goal, Binding **bindings, Module *module) catchframe->next = goalstack; goalstack = catchframe; - goalstack = addgoals(goalstack, catchgoal, module); + goalstack = addgoals(goalstack, catchgoal, module, clausenr++); return 1; } int -builtinthrow(Term *goal, Binding **bindings, Module *module) -{ - USED(bindings); - USED(module); - - Term *ball = goal->children; - - Goal *g; - for(g = goalstack; g != nil; g = g->next){ - if(g->catcher == nil) - continue; - - if(unify(g->catcher, ball, bindings)){ - goalstack = g->next; - Goal *newgoal = gmalloc(sizeof(Goal)); - newgoal->goal = copyterm(g->goal, nil); - newgoal->module = g->module; - newgoal->catcher = nil; - newgoal->next = goalstack; - goalstack = newgoal; - applybinding(newgoal->goal, *bindings); - - Choicepoint *cp = choicestack; - while(cp != nil && cp->id >= goal->clausenr) - cp = cp->next; - choicestack = cp; - return 1; - } - } - return 0; -} - -int builtincurrentprologflags(Term *goal, Binding **bindings, Module *module) { USED(module); @@ -852,13 +778,13 @@ builtinreadterm(Term *goal, Binding **bindings, Module *module) if(options->tag == CompoundTerm){ VarName *vn; for(vn = varnames; vn != nil; vn = vn->next){ - uniquevars = appendterm(uniquevars, copyterm(vn->var, nil)); + uniquevars = appendterm(uniquevars, copyterm(vn->var)); Term *name = mkatom(vn->name); - name->next = copyterm(vn->var, nil); + name->next = copyterm(vn->var); Term *vnpair = mkcompound(L"=", 2, name); varsnames = appendterm(varsnames, vnpair); if(vn->count == 1) - singlevars = appendterm(singlevars, copyterm(vnpair, nil)); + singlevars = appendterm(singlevars, copyterm(vnpair)); } } @@ -1053,11 +979,10 @@ assertclause(Term *clause, Module *module, int after, int dynamic) else arity = 0; - uvlong id = 0; Clause *cl = gmalloc(sizeof(Clause)); - cl->head = copyterm(head, &id); - cl->body = copyterm(body, &id); - cl->clausenr = id; + cl->head = copyterm(head); + cl->body = copyterm(body); + cl->clausenr = 0; cl->next = nil; Predicate *p; |