:- module(error, [must_be/2,
- can_be/2]).
+ can_be/2,
+ instantiation_error/1,
+ domain_error/3,
+ type_error/3
+ ]).
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
must_be_(Type, _) :-
var(Type),
- instantiation_error(Type).
+ instantiation_error(must_be/2).
must_be_(var, Term) :-
( var(Term) -> true
- ; throw(error(uninstantiation_error, _))
+ ; throw(error(uninstantiation_error, must_be/2))
).
must_be_(integer, Term) :- check_(integer, integer, Term).
must_be_(atom, Term) :- check_(atom, atom, Term).
must_be_(type, Term) :- check_(type, type, Term).
check_(Pred, Type, Term) :-
- ( var(Term) -> instantiation_error(Term)
+ ( var(Term) -> instantiation_error(must_be/2)
; call(Pred, Term) -> true
- ; type_error(Type, Term)
+ ; type_error(Type, Term, must_be/2)
).
-ilist(V) :- var(V), instantiation_error(V).
+ilist(V) :- var(V), instantiation_error(must_be/2).
ilist([]).
ilist([_|Ls]) :- ilist(Ls).
must_be(type, Type),
( var(Term) -> true
; can_(Type, Term) -> true
- ; type_error(Type, Term)
+ ; type_error(Type, Term, can_be/2)
).
can_(integer, Term) :- integer(Term).
Shorthands for throwing ISO errors.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-instantiation_error(_Term) :-
- throw(error(instantiation_error, _)).
+instantiation_error(Context) :-
+ throw(error(instantiation_error, Context)).
-domain_error(Type, Term) :-
- throw(error(domain_error(Type, Term), _)).
+domain_error(Type, Term, Context) :-
+ throw(error(domain_error(Type, Term), Context)).
-type_error(Type, Term) :-
- throw(error(type_error(Type, Term), _)).
+type_error(Type, Term, Context) :-
+ throw(error(type_error(Type, Term), Context)).