; var(Term) ->
instantiation_error(load/1)
; expand_terms_and_goals(Term, Terms),
- nl, write('Terms:'), write(Terms), nl, nl,
!,
( var(Terms) ->
instantiation_error(load/1)
; module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars, HeadVars0)
).
-module_expanded_head_variables(Head, MetaSpecs, HeadVars) :-
+module_expanded_head_variables(Head, HeadVars) :-
( var(Head) ->
instantiation_error(load/1)
; predicate_property(Head, meta_predicate(MetaSpecs)),
).
-expand_terms_and_goals(Term, Terms) :-
- expand_term(Term, Terms0),
- ( var(Terms0) ->
- instantiation_error(load/1)
- ; Terms0 = (Head1 :- Body0) ->
+expand_term_goals(Terms0, Terms) :-
+ ( Terms0 = (Head1 :- Body0) ->
( var(Head1) ->
instantiation_error(load/1)
; prolog_load_context(module, Target),
- module_expanded_head_variables(Head1, MetaSpecs, HeadVars),
+ module_expanded_head_variables(Head1, HeadVars),
expand_goal(Body0, Target, Body1, HeadVars)
),
Terms = (Head1 :- Body1)
).
+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) :-
user:term_expansion(UnexpandedTerm, ExpandedTerm).
instantiation_error(load/1)
; compile_dispatch(Term, Evacuable, VNs) ->
true
- ;
- compile_clause(Term, Evacuable, VNs)
+ ; compile_clause(Term, Evacuable, VNs)
).
-check_predicate_property(meta_predicate, Name, Arity, MetaPredicateTerm) :-
+check_predicate_property(meta_predicate, Module, Name, Arity, MetaPredicateTerm) :-
must_be(atom, Name),
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) :-
( var(Callable) ->
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),
- ( var(Property) ->
- true
- ; functor(Property, PropertyType, _)
- ),
- check_predicate_property(PropertyType, Name, Arity, Property)
+ extract_predicate_property(Property, PropertyType),
+ prolog_load_context(module, Module),
+ check_predicate_property(PropertyType, Module, Name, Arity, Property)
).
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars) :-
Goals =.. [GoalFunctor | SubGoals],
- ( GoalFunctor == (:) ->
- false
+ ( GoalFunctor == (:),
+ SubGoals = [M, SubGoal] ->
+ expand_module_names(SubGoal, MetaSpecs, Module, ExpandedSubGoal, HeadVars),
+ ExpandedGoals = M:ExpandedSubGoal
; expand_meta_predicate_subgoals(SubGoals, MetaSpecs, Module, ExpandedGoalList, HeadVars),
ExpandedGoals =.. [GoalFunctor | ExpandedGoalList]
).
pub(crate)
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) =
self.machine_st.read_predicate_key(
- self.machine_st[temp_v!(1)],
self.machine_st[temp_v!(2)],
+ self.machine_st[temp_v!(3)],
);
let compilation_target =
- if let Some(load_context) = self.load_contexts.last() {
- CompilationTarget::Module(load_context.module.clone())
- } else {
- CompilationTarget::User
+ match module_name.as_str() {
+ "user" => CompilationTarget::User,
+ _ => CompilationTarget::Module(module_name),
};
match self.indices.get_meta_predicate_spec(predicate_name, arity, &compilation_target) {
);
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 => {
self.machine_st.fail = true;