wrap meta-predicate specifications in functors (#1330)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user