summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtins.c45
-rw-r--r--parser.c2
2 files changed, 33 insertions, 14 deletions
diff --git a/builtins.c b/builtins.c
index b2c7da6..8215930 100644
--- a/builtins.c
+++ b/builtins.c
@@ -317,30 +317,49 @@ builtinfunctor(Term *goal, Binding **bindings, Module *module)
Term *name = term->next;
Term *arity = name->next;
- if(term->tag == CompoundTerm){
- Term *realname = mkatom(term->text);
- Term *realarity = mkinteger(term->arity);
- if(unify(name, realname, bindings) && unify(arity, realarity, bindings))
- return 1;
- }else if(arity->tag == IntegerTerm &&
- (name->tag == AtomTerm || name->tag == IntegerTerm || name->tag == FloatTerm)){
+ if(term->tag == VariableTerm && name->tag == VariableTerm)
+ Throw(instantiationerror());
+ if(term->tag == VariableTerm && arity->tag == VariableTerm)
+ Throw(instantiationerror());
+ if(term->tag == VariableTerm && !(name->tag == VariableTerm || name->tag == AtomTerm || name->tag == IntegerTerm || name->tag == FloatTerm))
+ Throw(typeerror(L"atomic", name));
+ if(term->tag == VariableTerm && !(arity->tag == VariableTerm || arity->tag == IntegerTerm))
+ Throw(typeerror(L"integer", arity));
+ if(term->tag == VariableTerm && name->tag != VariableTerm && name->tag != AtomTerm && arity->tag == IntegerTerm && arity->ival > 0)
+ Throw(typeerror(L"atom", name));
+ if(term->tag == VariableTerm && arity->tag == IntegerTerm && arity->ival < 0)
+ Throw(domainerror(L"not_less_than_zero", arity));
+
+
+ if(term->tag == VariableTerm){
if(arity->ival == 0)
return unify(term, name, bindings);
else{
- if(name->tag != AtomTerm)
- return 0;
-
- /* Make arity maky fresh variables */
+ /* Make arity many fresh variables */
int i;
Term *args = nil;
for(i = 0; i < arity->ival; i++){
- Rune *varname = runesmprint("FunctorVar%d", i);
- Term *arg = mkvariable(varname);
+ Term *arg = mkvariable(L"_");
args = appendterm(args, arg);
}
Term *realterm = mkcompound(name->text, arity->ival, args);
return unify(term, realterm, bindings);
}
+ }else{
+ Rune *namestr;
+ int arityint;
+
+ if(term->tag == CompoundTerm){
+ namestr = term->text;
+ arityint = term->arity;
+ }else{
+ namestr = prettyprint(term, 0, 0, 0);
+ arityint = 0;
+ }
+ Term *realname = mkatom(namestr);
+ Term *realarity = mkinteger(arityint);
+ if(unify(name, realname, bindings) && unify(arity, realarity, bindings))
+ return 1;
}
return 0;
}
diff --git a/parser.c b/parser.c
index 268b3c7..c0ac1d8 100644
--- a/parser.c
+++ b/parser.c
@@ -536,7 +536,7 @@ SkipWhite:
goto Integer;
}
while(isdigitrune(peek)){
- numD += (peek - L'0') / (10 * place);
+ numD += (peek - L'0') / (double)(10 * place);
peek = Bgetrune(parsein);
}
Bungetrune(parsein);