From 0f958749e189e4dacd7a1f70cfc33460e1228d3b Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Wed, 7 Jul 2021 16:32:02 +0000 Subject: Make '=..'/2 work according to spec. Introduce types.c for functions which tells us something about term types. Should be used a lot more instead of explicitly looking into terms->tag everywhere --- builtins.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'builtins.c') diff --git a/builtins.c b/builtins.c index 35db61a..5751502 100644 --- a/builtins.c +++ b/builtins.c @@ -409,6 +409,23 @@ builtinuniv(Term *goal, Binding **bindings, Module *module) Term *term = goal->children; Term *list = term->next; + if(term->tag == VariableTerm && ispartiallist(list)) + Throw(instantiationerror()); + if(!(ispartiallist(list) || islist(list))) + Throw(typeerror(L"list", list)); + + Term *head = listhead(list); + Term *tail = listtail(list); + + if(term->tag == VariableTerm && head->tag == VariableTerm) + Throw(instantiationerror()); + if(islist(list) && !(head->tag == AtomTerm || head->tag == VariableTerm) && !isemptylist(tail)) + Throw(typeerror(L"atom", head)); + if(islist(list) && head->tag == CompoundTerm && isemptylist(tail)) + Throw(typeerror(L"atomic", head)); + if(term->tag == VariableTerm && isemptylist(list)) + Throw(domainerror(L"non_empty_list", list)); + int len; if(term->tag == VariableTerm){ Rune *name; -- cgit v1.2.3