add module scoping to predicate_property, expand subgoals in module resolved predicates

This commit is contained in:
Mark Thom
2021-02-01 16:09:19 -07:00
parent 08b18af8a0
commit 6ed7767512
3 changed files with 48 additions and 26 deletions

View File

@@ -769,7 +769,7 @@ impl SystemClauseType {
("$prolog_lc_dir", 1) => Some(SystemClauseType::REPL(REPLCodePtr::LoadContextDirectory)), ("$prolog_lc_dir", 1) => Some(SystemClauseType::REPL(REPLCodePtr::LoadContextDirectory)),
("$prolog_lc_module", 1) => Some(SystemClauseType::REPL(REPLCodePtr::LoadContextModule)), ("$prolog_lc_module", 1) => Some(SystemClauseType::REPL(REPLCodePtr::LoadContextModule)),
("$prolog_lc_stream", 1) => Some(SystemClauseType::REPL(REPLCodePtr::LoadContextStream)), ("$prolog_lc_stream", 1) => Some(SystemClauseType::REPL(REPLCodePtr::LoadContextStream)),
("$cpp_meta_predicate_property", 3) => Some(SystemClauseType::REPL(REPLCodePtr::MetaPredicateProperty)), ("$cpp_meta_predicate_property", 4) => Some(SystemClauseType::REPL(REPLCodePtr::MetaPredicateProperty)),
("$compile_pending_predicates", 1) => Some(SystemClauseType::REPL(REPLCodePtr::CompilePendingPredicates)), ("$compile_pending_predicates", 1) => Some(SystemClauseType::REPL(REPLCodePtr::CompilePendingPredicates)),
_ => None, _ => None,
} }

View File

@@ -56,7 +56,6 @@ load_loop(Stream, Evacuable) :-
; var(Term) -> ; var(Term) ->
instantiation_error(load/1) instantiation_error(load/1)
; expand_terms_and_goals(Term, Terms), ; expand_terms_and_goals(Term, Terms),
nl, write('Terms:'), write(Terms), nl, nl,
!, !,
( var(Terms) -> ( var(Terms) ->
instantiation_error(load/1) instantiation_error(load/1)
@@ -100,7 +99,7 @@ module_expanded_head_variables_([HeadArg | HeadArgs], [MetaSpec | MetaSpecs], He
; module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars, HeadVars0) ; module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars, HeadVars0)
). ).
module_expanded_head_variables(Head, MetaSpecs, HeadVars) :- module_expanded_head_variables(Head, HeadVars) :-
( var(Head) -> ( var(Head) ->
instantiation_error(load/1) instantiation_error(load/1)
; predicate_property(Head, meta_predicate(MetaSpecs)), ; predicate_property(Head, meta_predicate(MetaSpecs)),
@@ -110,15 +109,12 @@ module_expanded_head_variables(Head, MetaSpecs, HeadVars) :-
). ).
expand_terms_and_goals(Term, Terms) :- expand_term_goals(Terms0, Terms) :-
expand_term(Term, Terms0), ( Terms0 = (Head1 :- Body0) ->
( var(Terms0) ->
instantiation_error(load/1)
; Terms0 = (Head1 :- Body0) ->
( var(Head1) -> ( var(Head1) ->
instantiation_error(load/1) instantiation_error(load/1)
; prolog_load_context(module, Target), ; prolog_load_context(module, Target),
module_expanded_head_variables(Head1, MetaSpecs, HeadVars), module_expanded_head_variables(Head1, HeadVars),
expand_goal(Body0, Target, Body1, HeadVars) expand_goal(Body0, Target, Body1, HeadVars)
), ),
Terms = (Head1 :- Body1) Terms = (Head1 :- Body1)
@@ -126,6 +122,16 @@ expand_terms_and_goals(Term, Terms) :-
). ).
expand_terms_and_goals(Term, Terms) :-
expand_term(Term, Terms0),
( var(Terms0) ->
instantiation_error(load/1)
; Terms0 = [_|_] ->
maplist(loader:expand_term_goals, Terms0, Terms)
; expand_term_goals(Terms0, Terms)
).
expand_term(UnexpandedTerm, ExpandedTerm) :- expand_term(UnexpandedTerm, ExpandedTerm) :-
user:term_expansion(UnexpandedTerm, ExpandedTerm). user:term_expansion(UnexpandedTerm, ExpandedTerm).
@@ -141,8 +147,7 @@ compile_dispatch_or_clause(Term, Evacuable, VNs) :-
instantiation_error(load/1) instantiation_error(load/1)
; compile_dispatch(Term, Evacuable, VNs) -> ; compile_dispatch(Term, Evacuable, VNs) ->
true true
; ; compile_clause(Term, Evacuable, VNs)
compile_clause(Term, Evacuable, VNs)
). ).
@@ -286,21 +291,30 @@ use_module(Module, Exports, Evacuable) :-
check_predicate_property(meta_predicate, Name, Arity, MetaPredicateTerm) :- check_predicate_property(meta_predicate, Module, Name, Arity, MetaPredicateTerm) :-
must_be(atom, Name), must_be(atom, Name),
must_be(integer, Arity), must_be(integer, Arity),
'$cpp_meta_predicate_property'(Name, Arity, MetaPredicateTerm). '$cpp_meta_predicate_property'(Module, Name, Arity, MetaPredicateTerm).
extract_predicate_property(Property, PropertyType) :-
( var(Property) ->
true
; functor(Property, PropertyType, _)
).
predicate_property(Callable, Property) :- predicate_property(Callable, Property) :-
( var(Callable) -> ( var(Callable) ->
instantiation_error(load/1) instantiation_error(load/1)
; Callable =.. [(:), Module, Callable0],
atom(Module) ->
functor(Callable0, Name, Arity),
extract_predicate_property(Property, PropertyType),
check_predicate_property(PropertyType, Module, Name, Arity, Property)
; functor(Callable, Name, Arity), ; functor(Callable, Name, Arity),
( var(Property) -> extract_predicate_property(Property, PropertyType),
true prolog_load_context(module, Module),
; functor(Property, PropertyType, _) check_predicate_property(PropertyType, Module, Name, Arity, Property)
),
check_predicate_property(PropertyType, Name, Arity, Property)
). ).
@@ -363,8 +377,10 @@ expand_meta_predicate_subgoals([], _, _, [], _).
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars) :- expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars) :-
Goals =.. [GoalFunctor | SubGoals], Goals =.. [GoalFunctor | SubGoals],
( GoalFunctor == (:) -> ( GoalFunctor == (:),
false SubGoals = [M, SubGoal] ->
expand_module_names(SubGoal, MetaSpecs, Module, ExpandedSubGoal, HeadVars),
ExpandedGoals = M:ExpandedSubGoal
; expand_meta_predicate_subgoals(SubGoals, MetaSpecs, Module, ExpandedGoalList, HeadVars), ; expand_meta_predicate_subgoals(SubGoals, MetaSpecs, Module, ExpandedGoalList, HeadVars),
ExpandedGoals =.. [GoalFunctor | ExpandedGoalList] ExpandedGoals =.. [GoalFunctor | ExpandedGoalList]
). ).

View File

@@ -1483,17 +1483,23 @@ impl Machine {
pub(crate) pub(crate)
fn meta_predicate_property(&mut self) { fn meta_predicate_property(&mut self) {
let module_name = atom_from!(
self.machine_st,
self.machine_st.store(self.machine_st.deref(
self.machine_st[temp_v!(1)]
))
);
let (predicate_name, arity) = let (predicate_name, arity) =
self.machine_st.read_predicate_key( self.machine_st.read_predicate_key(
self.machine_st[temp_v!(1)],
self.machine_st[temp_v!(2)], self.machine_st[temp_v!(2)],
self.machine_st[temp_v!(3)],
); );
let compilation_target = let compilation_target =
if let Some(load_context) = self.load_contexts.last() { match module_name.as_str() {
CompilationTarget::Module(load_context.module.clone()) "user" => CompilationTarget::User,
} else { _ => CompilationTarget::Module(module_name),
CompilationTarget::User
}; };
match self.indices.get_meta_predicate_spec(predicate_name, arity, &compilation_target) { match self.indices.get_meta_predicate_spec(predicate_name, arity, &compilation_target) {
@@ -1516,7 +1522,7 @@ impl Machine {
); );
self.machine_st.heap.push(HeapCellValue::Addr(Addr::HeapCell(list_loc))); self.machine_st.heap.push(HeapCellValue::Addr(Addr::HeapCell(list_loc)));
self.machine_st.unify(Addr::HeapCell(heap_loc), self.machine_st[temp_v!(3)]); self.machine_st.unify(Addr::HeapCell(heap_loc), self.machine_st[temp_v!(4)]);
} }
None => { None => {
self.machine_st.fail = true; self.machine_st.fail = true;