leave the expansion of incomplete goals in meta-predicates to call/N (#967, #970)

This commit is contained in:
Mark Thom
2021-05-19 14:07:46 -06:00
parent 57db17853e
commit 9002c33046
3 changed files with 29 additions and 29 deletions

View File

@@ -4,7 +4,7 @@
:- use_module(library(dif)). :- use_module(library(dif)).
:- meta_predicate if_(0, 0, 0). :- meta_predicate if_(1, 0, 0).
if_(If_1, Then_0, Else_0) :- if_(If_1, Then_0, Else_0) :-
call(If_1, T), call(If_1, T),

View File

@@ -586,10 +586,16 @@ strip_module(Goal, M, G) :-
expand_subgoal(UnexpandedGoals, MS, Module, ExpandedGoals, HeadVars) :- expand_subgoal(UnexpandedGoals, MS, Module, ExpandedGoals, HeadVars) :-
( var(UnexpandedGoals) -> ( var(UnexpandedGoals) ->
UnexpandedGoals = ExpandedGoals UnexpandedGoals = ExpandedGoals
; goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1), ; ( MS == 0 ->
% only expand complete goals. call/N will take care of incomplete goals
% by calling goal expansion after it is supplied the remaining arguments.
( goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1),
( Module \== user -> ( Module \== user ->
goal_expansion(UnexpandedGoals1, user, Goals) goal_expansion(UnexpandedGoals1, user, Goals)
; Goals = UnexpandedGoals1 ; Goals = UnexpandedGoals1
)
)
; Goals = UnexpandedGoals
), ),
( inner_meta_specs(MS, Goals, _, MetaSpecs) -> ( inner_meta_specs(MS, Goals, _, MetaSpecs) ->
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars) expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars)
@@ -740,14 +746,6 @@ thread_goals(Goals0, Goals1, Hole, Functor) :-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
call_clause(M:G1, G0) :-
functor(G1, F, _),
atom(F),
atom(M),
F \== [],
!,
expand_goal(M:G1, M, G0).
% The '$call' functor is an escape hatch from goal expansion. So far, % The '$call' functor is an escape hatch from goal expansion. So far,
% it is used only to avoid infinite recursion into expand_goal/3. % it is used only to avoid infinite recursion into expand_goal/3.
@@ -770,11 +768,15 @@ call_clause('$call'(G), G0) :-
). ).
call_clause(G, G0) :- call_clause(G, G0) :-
functor(G, F, _), strip_module(G, M, G1),
functor(G1, F, _),
atom(F), atom(F),
F \== [], F \== [],
load_context(M), ( var(M) ->
expand_goal(M:G, M, G0). load_context(M)
; true
),
expand_goal(M:G1, M, G0).
call(G) :- call(G) :-
@@ -786,16 +788,6 @@ call(G) :-
). ).
call_clause(M:G1, Args, _, G0) :-
atom(M),
G1 =.. [F | As],
atom(F),
F \== [],
!,
append(As, Args, As1),
G2 =.. [F | As1],
expand_goal(M:G2, M, G0).
call_clause('$call'(G1), Args, N, G0) :- call_clause('$call'(G1), Args, N, G0) :-
( var(G1), ( var(G1),
instantiation_error(call/N) instantiation_error(call/N)
@@ -819,10 +811,14 @@ call_clause('$call'(G1), Args, N, G0) :-
). ).
call_clause(G, Args, _, G0) :- call_clause(G, Args, _, G0) :-
G =.. [F | As], strip_module(G, M, G1),
G1 =.. [F | As],
atom(F), atom(F),
F \== [], F \== [],
load_context(M), ( var(M) ->
load_context(M)
; true
),
append(As, Args, As1), append(As, Args, As1),
G2 =.. [F | As1], G2 =.. [F | As1],
expand_goal(M:G2, M, G0). expand_goal(M:G2, M, G0).

View File

@@ -171,7 +171,11 @@ submit_query_and_print_results_(_, _) :-
submit_query_and_print_results(Term0, VarList) :- submit_query_and_print_results(Term0, VarList) :-
expand_goal(call(Term0), user, call(Term)), ( functor(Term0, call, _) ->
Term = Term0 % prevent pre-mature expansion of incomplete goal
% in the first argument, which is done by call/N
; expand_goal(call(Term0), user, call(Term))
),
setup_call_cleanup(bb_put('$first_answer', true), setup_call_cleanup(bb_put('$first_answer', true),
submit_query_and_print_results_(Term, VarList), submit_query_and_print_results_(Term, VarList),
bb_put('$first_answer', false)). bb_put('$first_answer', false)).