summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c82
1 files changed, 53 insertions, 29 deletions
diff --git a/builtins.c b/builtins.c
index cbb01e6..f6d667b 100644
--- a/builtins.c
+++ b/builtins.c
@@ -6,6 +6,15 @@
#define BuiltinProto(name) int name(Term *, Term *, Goal **, Choicepoint **, Binding **)
#define Match(X, Y) (runestrcmp(name, X) == 0 && arity == Y)
+#define Throw(What) do{\
+ Term *t = mkcompound(L"throw", 1, What); \
+ Goal *g = malloc(sizeof(Goal)); \
+ g->goal = t; \
+ g->catcher = nil; \
+ g->next = *goals; \
+ *goals = g; \
+ return 1; \
+}while(0)
BuiltinProto(builtinfail);
BuiltinProto(builtincall);
@@ -18,7 +27,6 @@ BuiltinProto(builtinatomic);
BuiltinProto(builtincompound);
BuiltinProto(builtinnonvar);
BuiltinProto(builtinnumber);
-BuiltinProto(builtinstring);
BuiltinProto(builtincompare);
BuiltinProto(builtinfunctor);
BuiltinProto(builtinarg);
@@ -28,6 +36,15 @@ BuiltinProto(builtincatch);
BuiltinProto(builtinthrow);
int compareterms(Term *, Term *);
+Term *instantiationerror(void);
+Term *typeerror(Rune *, Term *);
+Term *domainerror(Rune *, Term *);
+Term *existenceerror(Rune *, Term *);
+Term *permissionerror(Rune *, Rune *, Term *);
+Term *representationerror(Rune *);
+Term *evaluationerror(Rune *);
+Term *resourceerror(Rune *);
+Term *syntaxerror(Rune *);
Builtin
findbuiltin(Term *goal)
@@ -71,8 +88,6 @@ findbuiltin(Term *goal)
return builtinnonvar;
if(Match(L"number", 1))
return builtinnumber;
- if(Match(L"string", 1))
- return builtinstring;
if(Match(L"compare", 3))
return builtincompare;
if(Match(L"functor", 3))
@@ -224,17 +239,6 @@ builtinnumber(Term *database, Term *goal, Goal **goals, Choicepoint **choicestac
return (arg->tag == NumberTerm);
}
-int
-builtinstring(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack, Binding **bindings)
-{
- USED(database);
- USED(goals);
- USED(choicestack);
- USED(bindings);
- Term *arg = goal->children;
- return (arg->tag == StringTerm);
-}
-
#define Compare(A, B) ((A < B) ? -1 : ((A > B) ? 1 : 0))
int
@@ -262,7 +266,6 @@ compareterms(Term *t1, Term *t2)
}else
result = Compare(t1->numbertype, t2->numbertype);
break;
- case StringTerm:
case AtomTerm:
result = runestrcmp(t1->text, t2->text);
break;
@@ -364,8 +367,10 @@ builtinarg(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack,
Term *term = n->next;
Term *arg = term->next;
- if(n->tag != NumberTerm || n->numbertype != NumberInt || n->ival < 0)
+ if(n->tag != NumberTerm || n->numbertype != NumberInt)
return 0;
+ if(n->ival < 0)
+ Throw(domainerror(L"not_less_than_zero", n));
if(term->tag != CompoundTerm)
return 0;
if(n->ival >= term->arity)
@@ -377,18 +382,6 @@ builtinarg(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack,
return unify(arg, t, bindings);
}
-Term *
-mklist(Term *elems)
-{
- if(elems == nil)
- return mkatom(L"[]");
- else{
- Term *t = copyterm(elems, nil);
- t->next = mklist(elems->next);
- return mkcompound(L".", 2, t);
- }
-}
-
int
listlength(Term *term)
{
@@ -559,4 +552,35 @@ builtinthrow(Term *database, Term *goal, Goal **goals, Choicepoint **choicestack
}
}
return 0;
-} \ No newline at end of file
+}
+
+/* Helpers to create error terms */
+
+Term *
+instantiationerror(void)
+{
+ return mkatom(L"instantiation_error");
+}
+
+Term *
+typeerror(Rune *validtype, Term *culprit)
+{
+ Term *valid = mkatom(validtype);
+ valid->next = copyterm(culprit, nil);
+ return mkcompound(L"type_error", 2, valid);
+}
+
+Term *
+domainerror(Rune *validdomain, Term *culprit)
+{
+ Term *valid = mkatom(validdomain);
+ valid->next = copyterm(culprit, nil);
+ return mkcompound(L"domain_error", 2, valid);
+}
+
+Term *existenceerror(Rune *, Term *);
+Term *permissionerror(Rune *, Rune *, Term *);
+Term *representationerror(Rune *);
+Term *evaluationerror(Rune *);
+Term *resourceerror(Rune *);
+Term *syntaxerror(Rune *); \ No newline at end of file