diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-06 21:23:41 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-06 21:23:41 +0000 |
commit | 03738c67684b83692d9112858f07c745f355a157 (patch) | |
tree | 61ea389bcadab7211212646ea0c532b7d7635325 /builtins.c | |
parent | a0eb2bb268774a85411f037983d931f35bc7830f (diff) |
Store the calling module in each goal, and fix a bug where unification could leave behind some bindings even though the unification failed.
Diffstat (limited to 'builtins.c')
-rw-r--r-- | builtins.c | 98 |
1 files changed, 60 insertions, 38 deletions
@@ -5,11 +5,12 @@ #include "dat.h" #include "fns.h" -#define BuiltinProto(name) int name(Term *, Binding **) +#define BuiltinProto(name) int name(Term *, Binding **, Module *) #define Match(X, Y) (runestrcmp(name, X) == 0 && arity == Y) #define Throw(What) do{\ Goal *g = malloc(sizeof(Goal)); \ g->goal = What; \ + g->module = usermodule; \ g->catcher = nil; \ g->next = goalstack; \ goalstack = g; \ @@ -128,31 +129,27 @@ findbuiltin(Term *goal) } int -builtinfail(Term *goal, Binding **bindings) +builtinfail(Term *goal, Binding **bindings, Module *module) { USED(goal); USED(bindings); + USED(module); return 0; } int -builtincall(Term *goal, Binding **bindings) +builtincall(Term *goal, Binding **bindings, Module *module) { USED(bindings); - - Goal *g = malloc(sizeof(Goal)); - g->goal = goal->children; - g->catcher = nil; - g->next = goalstack; - goalstack = g; - + goalstack = addgoals(goalstack, goal->children, module); return 1; } int -builtincut(Term *goal, Binding **bindings) +builtincut(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Choicepoint *cp = choicestack; @@ -166,65 +163,73 @@ builtincut(Term *goal, Binding **bindings) } int -builtinvar(Term *goal, Binding **bindings) +builtinvar(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *arg = goal->children; return (arg->tag == VariableTerm); } int -builtinatom(Term *goal, Binding **bindings) +builtinatom(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *arg = goal->children; return (arg->tag == AtomTerm); } int -builtininteger(Term *goal, Binding **bindings) +builtininteger(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *arg = goal->children; return (arg->tag == IntegerTerm); } int -builtinfloat(Term *goal, Binding **bindings) +builtinfloat(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *arg = goal->children; return (arg->tag == FloatTerm); } int -builtinatomic(Term *goal, Binding **bindings) +builtinatomic(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *arg = goal->children; return (arg->tag == AtomTerm || arg->tag == FloatTerm || arg->tag == IntegerTerm); } int -builtincompound(Term *goal, Binding **bindings) +builtincompound(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *arg = goal->children; return (arg->tag == CompoundTerm); } int -builtinnonvar(Term *goal, Binding **bindings) +builtinnonvar(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *arg = goal->children; return (arg->tag != VariableTerm); } int -builtinnumber(Term *goal, Binding **bindings) +builtinnumber(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *arg = goal->children; return (arg->tag == FloatTerm || arg->tag == IntegerTerm); } @@ -282,8 +287,9 @@ compareterms(Term *t1, Term *t2) } int -builtincompare(Term *goal, Binding **bindings) +builtincompare(Term *goal, Binding **bindings, Module *module) { + USED(module); Term *order = goal->children; Term *t1 = order->next; Term *t2 = t1->next; @@ -302,9 +308,9 @@ builtincompare(Term *goal, Binding **bindings) } int -builtinfunctor(Term *goal, Binding **bindings) +builtinfunctor(Term *goal, Binding **bindings, Module *module) { - + USED(module); Term *term = goal->children; Term *name = term->next; Term *arity = name->next; @@ -338,9 +344,9 @@ builtinfunctor(Term *goal, Binding **bindings) } int -builtinarg(Term *goal, Binding **bindings) +builtinarg(Term *goal, Binding **bindings, Module *module) { - + USED(module); Term *n = goal->children; Term *term = n->next; Term *arg = term->next; @@ -373,8 +379,9 @@ listlength(Term *term) } int -builtinuniv(Term *goal, Binding **bindings) +builtinuniv(Term *goal, Binding **bindings, Module *module) { + USED(module); Term *term = goal->children; Term *list = term->next; @@ -445,8 +452,9 @@ aritheval(Term *expr) } int -builtinis(Term *goal, Binding **bindings) +builtinis(Term *goal, Binding **bindings, Module *module) { + USED(module); Term *result = goal->children; Term *expr = result->next; @@ -459,7 +467,7 @@ builtinis(Term *goal, Binding **bindings) } int -builtincatch(Term *goal, Binding **bindings) +builtincatch(Term *goal, Binding **bindings, Module *module) { USED(bindings); @@ -469,12 +477,14 @@ builtincatch(Term *goal, Binding **bindings) Goal *catchframe = malloc(sizeof(Goal)); catchframe->goal = recover; + catchframe->module = module; catchframe->catcher = catcher; catchframe->next = goalstack; goalstack = catchframe; Goal *g = malloc(sizeof(Goal)); g->goal = catchgoal; + g->module = module; g->catcher = nil; g->next = goalstack; goalstack = g; @@ -483,9 +493,10 @@ builtincatch(Term *goal, Binding **bindings) } int -builtinthrow(Term *goal, Binding **bindings) +builtinthrow(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *ball = goal->children; @@ -505,6 +516,7 @@ builtinthrow(Term *goal, Binding **bindings) goalstack = g->next; Goal *newgoal = malloc(sizeof(Goal)); newgoal->goal = copyterm(g->goal, nil); + newgoal->module = module; newgoal->catcher = nil; newgoal->next = goalstack; goalstack = newgoal; @@ -522,17 +534,19 @@ builtinthrow(Term *goal, Binding **bindings) } int -builtincurrentprologflag(Term *goal, Binding **bindings) +builtincurrentprologflag(Term *goal, Binding **bindings, Module *module) { USED(goal); USED(bindings); + USED(module); return 0; } int -builtinsetprologflag(Term *goal, Binding **bindings) +builtinsetprologflag(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *key = goal->children; Term *value = key->next; @@ -549,9 +563,10 @@ builtinsetprologflag(Term *goal, Binding **bindings) } int -builtinopen(Term *goal, Binding **bindings) +builtinopen(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *sourcesink = goal->children; Term *mode = sourcesink->next; @@ -584,9 +599,10 @@ builtinopen(Term *goal, Binding **bindings) } int -builtinclose(Term *goal, Binding **bindings) +builtinclose(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *stream = goal->children; Term *options = stream->next; @@ -609,9 +625,10 @@ builtinclose(Term *goal, Binding **bindings) } int -builtincurrentinput(Term *goal, Binding **bindings) +builtincurrentinput(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *stream = goal->children; if(stream->tag != VariableTerm && stream->tag != IntegerTerm) @@ -622,9 +639,10 @@ builtincurrentinput(Term *goal, Binding **bindings) } int -builtincurrentoutput(Term *goal, Binding **bindings) +builtincurrentoutput(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *stream = goal->children; if(stream->tag != VariableTerm && stream->tag != IntegerTerm) @@ -635,9 +653,10 @@ builtincurrentoutput(Term *goal, Binding **bindings) } int -builtinsetinput(Term *goal, Binding **bindings) +builtinsetinput(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *stream = goal->children; if(stream->tag == VariableTerm) @@ -657,9 +676,10 @@ builtinsetinput(Term *goal, Binding **bindings) } int -builtinsetoutput(Term *goal, Binding **bindings) +builtinsetoutput(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *stream = goal->children; if(stream->tag == VariableTerm) @@ -679,9 +699,10 @@ builtinsetoutput(Term *goal, Binding **bindings) } int -builtinreadterm(Term *goal, Binding **bindings) +builtinreadterm(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *stream = goal->children; Term *term = stream->next; @@ -709,9 +730,10 @@ builtinreadterm(Term *goal, Binding **bindings) } int -builtinwriteterm(Term *goal, Binding **bindings) +builtinwriteterm(Term *goal, Binding **bindings, Module *module) { USED(bindings); + USED(module); Term *stream = goal->children; Term *term = stream->next; |