From 43f774346703f2b0015ff59c51e8b31a9665cb06 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Sun, 30 Sep 2018 23:36:02 +0200 Subject: [PATCH] ENHANCED: Better error handling if Type is invalid. Strictly speaking, type is currently not a type, so a domain error is appropriate if Type is not a valid type. However, there are also other cases where new types have been introduced in the past, and this seems a good candidate for a new type. Let us hence use a type error. Example: ?- can_be(listi, [a,b|Ls]). %@ ERROR: Type error: `type' expected, found `listi' (an atom) --- src/prolog/lib/error.pl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/prolog/lib/error.pl b/src/prolog/lib/error.pl index 21955f50..e7b7fe66 100644 --- a/src/prolog/lib/error.pl +++ b/src/prolog/lib/error.pl @@ -27,15 +27,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ must_be(Type, Term) :- + must_be_(type, Type), must_be_(Type, Term). - must_be_(Type, _) :- var(Type), instantiation_error(Type). must_be_(integer, Term) :- check_(integer, integer, Term). must_be_(atom, Term) :- check_(atom, atom, Term). must_be_(list, Term) :- check_(ilist, list, Term). +must_be_(type, Term) :- check_(type, type, Term). check_(Pred, Type, Term) :- ( var(Term) -> instantiation_error(Term) @@ -47,6 +48,10 @@ ilist(V) :- var(V), instantiation_error(V). ilist([]). ilist([_|Ls]) :- ilist(Ls). +type(type). +type(integer). +type(atom). +type(list). /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - can_be(Type, Term) @@ -63,6 +68,7 @@ ilist([_|Ls]) :- ilist(Ls). can_be(Type, Term) :- + must_be(type, Type), ( var(Term) -> true ; can_(Type, Term) -> true ; type_error(Type, Term) -- 2.54.0