From: Mark Thom Date: Sun, 13 Mar 2022 18:53:31 +0000 (-0600) Subject: add (:) meta-predicate argument indicator (#1302) X-Git-Tag: v0.9.1~109 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=e88ec6736c12dd8b6afe07e8a80230988d24fe77;p=scryer-prolog.git add (:) meta-predicate argument indicator (#1302) --- diff --git a/src/forms.rs b/src/forms.rs index aef5ad95..a3c2b354 100644 --- a/src/forms.rs +++ b/src/forms.rs @@ -267,6 +267,7 @@ pub enum MetaSpec { Minus, Plus, Either, + Colon, RequiresExpansionWithArgument(usize), } diff --git a/src/loader.pl b/src/loader.pl index cb872035..b0bc5a6d 100644 --- a/src/loader.pl +++ b/src/loader.pl @@ -213,6 +213,9 @@ inner_meta_specs(0, HeadArg, InnerHeadArgs, InnerMetaSpecs) :- InnerMetaSpecs0 =.. [_ | InnerMetaSpecs], HeadArg =.. [_ | InnerHeadArgs]. +inner_meta_specs((:), _, [], []) :- + !. + inner_meta_specs(N, HeadArg, InnerHeadArgs, InnerMetaSpecs) :- integer(N), N >= 0, @@ -636,6 +639,7 @@ expand_module_name(ESG0, MS, M, ESG) :- ; ESG0 = _:_ -> ESG = ESG0 ; functor(ESG0, F, A0), + integer(MS), A is A0 + MS, functor(EESG0, F, A), predicate_property(EESG0, built_in) -> @@ -647,6 +651,7 @@ expand_module_name(ESG0, MS, M, ESG) :- expand_meta_predicate_subgoals([SG | SGs], [MS | MSs], M, [ESG | ESGs], HeadVars) :- ( ( integer(MS), MS >= 0 + ; MS == (:) ) -> ( var(SG), pairs:same_key(SG, HeadVars, [_|_], _) -> diff --git a/src/machine/loader.rs b/src/machine/loader.rs index ce251e84..2ab85de4 100644 --- a/src/machine/loader.rs +++ b/src/machine/loader.rs @@ -2200,6 +2200,7 @@ impl Machine { MetaSpec::Minus => atom_as_cell!(atom!("+")), MetaSpec::Plus => atom_as_cell!(atom!("-")), MetaSpec::Either => atom_as_cell!(atom!("?")), + MetaSpec::Colon => atom_as_cell!(atom!(":")), MetaSpec::RequiresExpansionWithArgument(ref arg_num) => { fixnum_as_cell!(Fixnum::build_with(*arg_num as i64)) } diff --git a/src/machine/preprocessor.rs b/src/machine/preprocessor.rs index 50a46947..bd3c9211 100644 --- a/src/machine/preprocessor.rs +++ b/src/machine/preprocessor.rs @@ -296,6 +296,7 @@ fn setup_meta_predicate<'a, LS: LoadState<'a>>( atom!("+") => MetaSpec::Plus, atom!("-") => MetaSpec::Minus, atom!("?") => MetaSpec::Either, + atom!(":") => MetaSpec::Colon, _ => return Err(CompilationError::InvalidMetaPredicateDecl), };