summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-07-27 15:20:29 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-07-27 15:20:29 +0000
commit4fba3e66dce0d167d2031a0d1f1f6f4571cbd981 (patch)
treea9ec00bc693e40ec4debca451de495889177b090 /builtins.c
parent0a706b5b413aa96a944f45f28fb948c62e763555 (diff)
Don't use strings to identify vars, use numbers
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c106
1 files changed, 13 insertions, 93 deletions
diff --git a/builtins.c b/builtins.c
index 0256699..7d32d98 100644
--- a/builtins.c
+++ b/builtins.c
@@ -374,12 +374,7 @@ compareterms(Term *t1, Term *t2)
/* Same type term */
switch(t1->tag){
case VariableTerm:
- if(runestrcmp(t1->text, L"_") == 0 && runestrcmp(t2->text, L"_") == 0)
- result = 1; /* Special case since _ and _ are always different */
- else if(t1->clausenr == t2->clausenr)
- result = runestrcmp(t1->text, t2->text);
- else
- result = Compare(t1->clausenr, t2->clausenr);
+ result = Compare(t1->varnr, t2->varnr);
break;
case FloatTerm:
result = Compare(t1->dval, t2->dval);
@@ -465,7 +460,7 @@ builtinfunctor(Term *goal, Binding **bindings, Module *module)
int i;
Term *args = nil;
for(i = 0; i < arity->ival; i++){
- Term *arg = mkvariable(L"_");
+ Term *arg = mkvariable();
args = appendterm(args, arg);
}
Term *realterm = mkcompound(name->text, arity->ival, args);
@@ -823,77 +818,10 @@ builtinsetoutput(Term *goal, Binding **bindings, Module *module)
return 1;
}
-Term *
-readtermvars(Term *t)
-{
- Term *vars;
- switch(t->tag){
- case VariableTerm:
- vars = copyterm(t, nil);
- break;
- case CompoundTerm:
- vars = nil;
- int n = t->arity;
- for(t = t->children; n > 0; t = t->next, n--){
- Term *childvars = readtermvars(t);
- while(childvars){
- Term *childvarscopy = copyterm(childvars, nil);
- vars = appendterm(vars, childvarscopy);
- childvars = childvars->next;
- }
- }
- break;
- default:
- vars = nil;
- }
- return vars;
-}
-
-Term *
-varsandnames(Term *vars)
-{
- Term *varsnames = nil;
- Term *var;
- for(var = vars; var != nil; var = var->next){
- if(runestrcmp(var->text, L"_") == 0)
- continue;
- Term *varname = mkatom(var->text);
- varname->next = copyterm(var, nil);
- Term *pair = mkcompound(L"=", 2, varname);
- varsnames = appendterm(varsnames, pair);
- }
- return varsnames;
-}
-
-Term *
-singletons(Term *vars)
-{
- Term *var;
- Term *varsnames = varsandnames(vars);
- Term *singles = nil;
-
- for(var = varsnames; var != nil; var = var->next){
- Term *tmp;
- int duplicate = 0;
- for(tmp = varsnames; tmp != nil ; tmp = tmp->next){
- if(tmp == var)
- continue;
- if(runestrcmp(var->children->text, tmp->children->text) == 0){
- duplicate = 1;
- break;
- }
- }
- if(!duplicate)
- singles = appendterm(singles, copyterm(var, nil));
- }
- return singles;
-}
-
int
builtinreadterm(Term *goal, Binding **bindings, Module *module)
{
USED(bindings);
-
Term *stream = goal->children;
Term *term = stream->next;
Term *options = term->next;
@@ -910,7 +838,8 @@ builtinreadterm(Term *goal, Binding **bindings, Module *module)
Throw(permissionerror(L"input", L"binary_stream", stream));
Term *realterm;
- int error = readterm(stream, &realterm, module);
+ VarName *varnames;
+ int error = readterm(stream, &realterm, module, &varnames);
if(error)
Throw(realterm);
@@ -921,25 +850,16 @@ builtinreadterm(Term *goal, Binding **bindings, Module *module)
Term *uniquevars = nil;
Term *varsnames = nil;
if(options->tag == CompoundTerm){
- Term *allvars = readtermvars(realterm);
- Term *tmp1;
- for(tmp1 = allvars; tmp1 != nil; tmp1 = tmp1->next){
- Term *tmp2;
- int duplicate = 0;
- for(tmp2 = uniquevars; tmp2 != nil; tmp2 = tmp2->next){
- if(runestrcmp(tmp2->text, tmp1->text) == 0){
- duplicate = 1;
- break;
- }
- }
- if(!duplicate){
- Term *v = copyterm(tmp1, nil);
- uniquevars = appendterm(uniquevars, v);
- }
+ VarName *vn;
+ for(vn = varnames; vn != nil; vn = vn->next){
+ uniquevars = appendterm(uniquevars, copyterm(vn->var, nil));
+ Term *name = mkatom(vn->name);
+ name->next = copyterm(vn->var, nil);
+ Term *vnpair = mkcompound(L"=", 2, name);
+ varsnames = appendterm(varsnames, vnpair);
+ if(vn->count == 1)
+ singlevars = appendterm(singlevars, copyterm(vnpair, nil));
}
-
- varsnames = varsandnames(uniquevars);
- singlevars = singletons(allvars);
}
Term *op;