From: Mark Date: Thu, 20 Jul 2023 20:27:10 +0000 (-0600) Subject: improve goal expansion and (',') interpretation error handling X-Git-Tag: v0.9.2~35 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=e529e7ba2173aca9762909684b46a74b79c37651;p=scryer-prolog.git improve goal expansion and (',') interpretation error handling --- diff --git a/src/lib/builtins.pl b/src/lib/builtins.pl index 983503cb..81f63ddd 100644 --- a/src/lib/builtins.pl +++ b/src/lib/builtins.pl @@ -334,6 +334,9 @@ dispatch_prep(Gs, B, [Cont|Conts]) :- ; Gs0 == ! -> Cont = '$call'(builtins:set_cp(B)), Conts = [] + ; nonvar(Gs0), + \+ callable(Gs0) -> + throw(dispatch_prep_error) ; Cont = Gs, Conts = [] ) diff --git a/src/loader.pl b/src/loader.pl index 1eafedb0..441852ee 100644 --- a/src/loader.pl +++ b/src/loader.pl @@ -274,6 +274,13 @@ module_expanded_head_variables(Head, HeadVars) :- ). +print_goal_expansion_warning(Pred) :- + nl, + write('Warning: clause body goal expansion failed because '), + writeq(Pred), + write(' is not callable.'), + nl. + expand_term_goals(Terms0, Terms) :- ( Terms0 = (Head1 :- Body0) -> ( var(Head1) -> @@ -282,13 +289,21 @@ expand_term_goals(Terms0, Terms) :- ( atom(Module) -> prolog_load_context(module, Target), module_expanded_head_variables(Head2, HeadVars), - expand_goal(Body0, Target, Body1, HeadVars), + catch(expand_goal(Body0, Target, Body1, HeadVars), + error(type_error(callable, Pred), _), + ( loader:print_goal_expansion_warning(Pred), + builtins:(Body1 = Body0) + )), Terms = (Module:Head2 :- Body1) ; type_error(atom, Module, load/1) ) ; module_expanded_head_variables(Head1, HeadVars), prolog_load_context(module, Target), - expand_goal(Body0, Target, Body1, HeadVars), + catch(expand_goal(Body0, Target, Body1, HeadVars), + error(type_error(callable, Pred), _), + ( loader:print_goal_expansion_warning(Pred), + builtins:(Body1 = Body0) + )), Terms = (Head1 :- Body1) ) ; Terms = Terms0 @@ -688,7 +703,10 @@ expand_subgoal(UnexpandedGoals, MS, M, ExpandedGoals, HeadVars) :- expand_module_name(ESG0, MS, M, ESG) :- ( var(ESG0) -> - ESG = M:ESG0 + ( M == user -> + ESG = ESG0 + ; ESG = M:ESG0 + ) ; ESG0 = _:_ -> ESG = ESG0 ; functor(ESG0, F, A0), @@ -753,7 +771,6 @@ expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars) :- ). - :- non_counted_backtracking expand_goal/3. expand_goal(UnexpandedGoals, Module, ExpandedGoals) :-