From: Mark Thom Date: Tue, 8 Mar 2022 05:36:52 +0000 (-0700) Subject: wrap meta-predicate specifications in functors (#1330) X-Git-Tag: v0.9.1~122 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=8762647b55c92960a0dcac9c644c788affd8c946;p=scryer-prolog.git wrap meta-predicate specifications in functors (#1330) --- diff --git a/src/loader.pl b/src/loader.pl index 3d3e8bd2..cb872035 100644 --- a/src/loader.pl +++ b/src/loader.pl @@ -209,7 +209,8 @@ compile_term(Term, Evacuable) :- inner_meta_specs(0, HeadArg, InnerHeadArgs, InnerMetaSpecs) :- !, - predicate_property(HeadArg, meta_predicate(InnerMetaSpecs)), + predicate_property(HeadArg, meta_predicate(InnerMetaSpecs0)), + InnerMetaSpecs0 =.. [_ | InnerMetaSpecs], HeadArg =.. [_ | InnerHeadArgs]. inner_meta_specs(N, HeadArg, InnerHeadArgs, InnerMetaSpecs) :- @@ -219,7 +220,8 @@ inner_meta_specs(N, HeadArg, InnerHeadArgs, InnerMetaSpecs) :- length(InnerHeadArgs1, N), append(InnerHeadArgs, InnerHeadArgs1, InnerHeadArgs0), CompleteHeadArg =.. [Functor | InnerHeadArgs0], - predicate_property(CompleteHeadArg, meta_predicate(InnerMetaSpecs)). + predicate_property(CompleteHeadArg, meta_predicate(InnerMetaSpecs0)), + InnerMetaSpecs0 =.. [_ | InnerMetaSpecs]. 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) :- ( var(Head) -> instantiation_error(load/1) - ; predicate_property(Head, meta_predicate(MetaSpecs)), + ; predicate_property(Head, meta_predicate(MetaSpecs0)), + MetaSpecs0 =.. [_ | MetaSpecs], Head =.. [_ | HeadArgs] -> module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars, []) ; HeadVars = [] @@ -709,7 +712,8 @@ expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars) :- ), ( expand_goal_cases(Goals, Module, ExpandedGoals, HeadVars) -> 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) ; thread_goals(Goals, ExpandedGoals, (',')) ; Goals = ExpandedGoals diff --git a/src/machine/loader.rs b/src/machine/loader.rs index 0b436f6f..ce251e84 100644 --- a/src/machine/loader.rs +++ b/src/machine/loader.rs @@ -2192,8 +2192,10 @@ impl Machine { .get_meta_predicate_spec(predicate_name, arity, &compilation_target) { Some(meta_specs) => { - let list_loc = iter_to_heap_list( - &mut self.machine_st.heap, + let term_loc = self.machine_st.heap.len(); + + 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 { MetaSpec::Minus => atom_as_cell!(atom!("+")), MetaSpec::Plus => atom_as_cell!(atom!("-")), @@ -2201,12 +2203,13 @@ impl Machine { MetaSpec::RequiresExpansionWithArgument(ref arg_num) => { fixnum_as_cell!(Fixnum::build_with(*arg_num as i64)) } - })); + }) + ); 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(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]); }