wrap meta-predicate specifications in functors (#1330)

This commit is contained in:
Mark Thom
2022-03-07 22:36:52 -07:00
parent 664c0ee77c
commit 8762647b55
2 changed files with 15 additions and 8 deletions

View File

@@ -209,7 +209,8 @@ compile_term(Term, Evacuable) :-
inner_meta_specs(0, HeadArg, InnerHeadArgs, InnerMetaSpecs) :- inner_meta_specs(0, HeadArg, InnerHeadArgs, InnerMetaSpecs) :-
!, !,
predicate_property(HeadArg, meta_predicate(InnerMetaSpecs)), predicate_property(HeadArg, meta_predicate(InnerMetaSpecs0)),
InnerMetaSpecs0 =.. [_ | InnerMetaSpecs],
HeadArg =.. [_ | InnerHeadArgs]. HeadArg =.. [_ | InnerHeadArgs].
inner_meta_specs(N, HeadArg, InnerHeadArgs, InnerMetaSpecs) :- inner_meta_specs(N, HeadArg, InnerHeadArgs, InnerMetaSpecs) :-
@@ -219,7 +220,8 @@ inner_meta_specs(N, HeadArg, InnerHeadArgs, InnerMetaSpecs) :-
length(InnerHeadArgs1, N), length(InnerHeadArgs1, N),
append(InnerHeadArgs, InnerHeadArgs1, InnerHeadArgs0), append(InnerHeadArgs, InnerHeadArgs1, InnerHeadArgs0),
CompleteHeadArg =.. [Functor | InnerHeadArgs0], CompleteHeadArg =.. [Functor | InnerHeadArgs0],
predicate_property(CompleteHeadArg, meta_predicate(InnerMetaSpecs)). predicate_property(CompleteHeadArg, meta_predicate(InnerMetaSpecs0)),
InnerMetaSpecs0 =.. [_ | InnerMetaSpecs].
module_expanded_head_variables_([], _, HeadVars, HeadVars). module_expanded_head_variables_([], _, HeadVars, HeadVars).
@@ -242,7 +244,8 @@ module_expanded_head_variables_([HeadArg | HeadArgs], [MetaSpec | MetaSpecs], He
module_expanded_head_variables(Head, 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(MetaSpecs0)),
MetaSpecs0 =.. [_ | MetaSpecs],
Head =.. [_ | HeadArgs] -> Head =.. [_ | HeadArgs] ->
module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars, []) module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars, [])
; HeadVars = [] ; HeadVars = []
@@ -709,7 +712,8 @@ expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars) :-
), ),
( expand_goal_cases(Goals, Module, ExpandedGoals, HeadVars) -> ( expand_goal_cases(Goals, Module, ExpandedGoals, HeadVars) ->
true true
; predicate_property(Module:Goals, meta_predicate(MetaSpecs)) -> ; predicate_property(Module:Goals, meta_predicate(MetaSpecs0)),
MetaSpecs0 =.. [_ | MetaSpecs] ->
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars) expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars)
; thread_goals(Goals, ExpandedGoals, (',')) ; thread_goals(Goals, ExpandedGoals, (','))
; Goals = ExpandedGoals ; Goals = ExpandedGoals

View File

@@ -2192,8 +2192,10 @@ impl Machine {
.get_meta_predicate_spec(predicate_name, arity, &compilation_target) .get_meta_predicate_spec(predicate_name, arity, &compilation_target)
{ {
Some(meta_specs) => { Some(meta_specs) => {
let list_loc = iter_to_heap_list( let term_loc = self.machine_st.heap.len();
&mut self.machine_st.heap,
self.machine_st.heap.push(atom_as_cell!(predicate_name, arity));
self.machine_st.heap.extend(
meta_specs.iter().map(|meta_spec| match meta_spec { meta_specs.iter().map(|meta_spec| match meta_spec {
MetaSpec::Minus => atom_as_cell!(atom!("+")), MetaSpec::Minus => atom_as_cell!(atom!("+")),
MetaSpec::Plus => atom_as_cell!(atom!("-")), MetaSpec::Plus => atom_as_cell!(atom!("-")),
@@ -2201,12 +2203,13 @@ impl Machine {
MetaSpec::RequiresExpansionWithArgument(ref arg_num) => { MetaSpec::RequiresExpansionWithArgument(ref arg_num) => {
fixnum_as_cell!(Fixnum::build_with(*arg_num as i64)) fixnum_as_cell!(Fixnum::build_with(*arg_num as i64))
} }
})); })
);
let heap_loc = self.machine_st.heap.len(); let heap_loc = self.machine_st.heap.len();
self.machine_st.heap.push(atom_as_cell!(atom!("meta_predicate"), 1)); self.machine_st.heap.push(atom_as_cell!(atom!("meta_predicate"), 1));
self.machine_st.heap.push(heap_loc_as_cell!(list_loc)); self.machine_st.heap.push(str_loc_as_cell!(term_loc));
unify!(self.machine_st, str_loc_as_cell!(heap_loc), self.machine_st.registers[4]); unify!(self.machine_st, str_loc_as_cell!(heap_loc), self.machine_st.registers[4]);
} }