interpl

Experiments with intepreters in Prolog
git clone https://ccx.te2000.cz/git/interpl
Log | Files | Refs | README

interp_errors.pl (2423B)


      1 :- module(interp_errors,
      2 	[ interp_error/2
      3 	, interp_error/3
      4 	, parent_name/1
      5 	, validate_error/2
      6 	]).
      7 
      8 %%% messages
      9 
     10 :- multifile prolog:error_message//1.
     11 
     12 prolog:error_message(read_error) -->
     13     [ 'Failed to read line.' ].
     14 
     15 prolog:error_message(parse_error(Codes)) -->
     16     [ 'Failed to parse line: "~s".' - [Codes] ].
     17 
     18 prolog:error_message(evaluation_error(Codes)) -->
     19     [ 'Failed to evaluate expression: "~s".' - [Codes] ].
     20 
     21 prolog:error_message(interp_error(eval, Expression)) -->
     22     [ 'Don\'t know how to evaluate: "~w".' - [Expression] ].
     23 
     24 prolog:error_message(interp_error(eval_fail, Expression)) -->
     25     [ 'Internal error evaluating: "~w".' - [Expression] ].
     26 
     27 prolog:error_message(interp_error(apply_fail, Expression)) -->
     28     [ 'Internal error calling: "~w".' - [Expression] ].
     29 
     30 prolog:error_message(interp_error(arity, Func)) -->
     31     [ 'Invalid amount of arguments for function: "~w".' - [Func] ].
     32 
     33 prolog:error_message(interp_error(unbound_var, VarName)) -->
     34     [ 'No such variable: "~w".' - [VarName] ].
     35 
     36 prolog:error_message(interp_error(primitive, Func)) -->
     37     [ 'Error evaluating primitive function: "~w".' - [Func] ].
     38 
     39 prolog:error_message(interp_error(type, Expected)) -->
     40     [ 'Got invalid value for type ~w.' - [Expected] ].
     41 
     42 %%% exception throwing helpers
     43 
     44 validate_error(interp_error(apply_fail, _), _) :- !.
     45 validate_error(interp_error(eval, _), _) :- !.
     46 validate_error(interp_error(eval_fail, _), _) :- !.
     47 validate_error(interp_error(arity, _), _) :- !.
     48 validate_error(interp_error(unbound_var, _), _) :- !.
     49 validate_error(interp_error(primitive, _), _) :- !.
     50 validate_error(interp_error(type, _), _) :- !.
     51 validate_error(ErrorVal, Caller) :-
     52 	throw(error(
     53 		domain_error(interp_error/2, ErrorVal),
     54 		context(Caller, 'Tried to throw invalid interp_error')
     55 	)).
     56 	
     57 validate_and_throw(Error, Caller, Message) :-
     58 	validate_error(Error, Caller),
     59 	throw(error(Error, context(Caller, Message))).
     60 
     61 parent_name(Name) :-
     62 	prolog_current_frame(ThisFrame),
     63 	prolog_frame_attribute(ThisFrame, parent, CallerFrame),
     64 	prolog_frame_attribute(CallerFrame, parent, CallerParentFrame),
     65 	prolog_frame_attribute(CallerParentFrame, predicate_indicator, Name).
     66 
     67 interp_error(Kind, ErrorData) :-
     68 	parent_name(Caller),
     69 	validate_and_throw(interp_error(Kind, ErrorData), Caller, _).
     70 
     71 interp_error(Kind, ErrorData, Message) :-
     72 	parent_name(Caller),
     73 	validate_and_throw(interp_error(Kind, ErrorData), Caller, Message).
     74