diff options
Diffstat (limited to 'builtins.c')
-rw-r--r-- | builtins.c | 106 |
1 files changed, 13 insertions, 93 deletions
@@ -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; |