summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c98
1 files changed, 60 insertions, 38 deletions
diff --git a/builtins.c b/builtins.c
index e0659c5..1dede9e 100644
--- a/builtins.c
+++ b/builtins.c
@@ -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;