]> Repositorios git - scryer-prolog.git/commitdiff
add (:) meta-predicate argument indicator (#1302)
authorMark Thom <[email protected]>
Sun, 13 Mar 2022 18:53:31 +0000 (12:53 -0600)
committerMark Thom <[email protected]>
Sun, 13 Mar 2022 19:54:58 +0000 (13:54 -0600)
src/forms.rs
src/loader.pl
src/machine/loader.rs
src/machine/preprocessor.rs

index aef5ad95b9862be5c0e76358023af7eb83f261b4..a3c2b3547f0f336a6bfecd48a8b70de77e78ecbd 100644 (file)
@@ -267,6 +267,7 @@ pub enum MetaSpec {
     Minus,
     Plus,
     Either,
+    Colon,
     RequiresExpansionWithArgument(usize),
 }
 
index cb872035c3b7283c2354897be1183b85614b7fcd..b0bc5a6d286d9797e7e11c8f4a98c1d8220de0ad 100644 (file)
@@ -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, [_|_], _) ->
index ce251e8461f19057cf93a76aeb27a1f3065fb356..2ab85de4ee3c95412862f3faadbe18f70db62d01 100644 (file)
@@ -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))
                         }
index 50a469470fd869f70c715183d1279e4a152fde59..bd3c9211242d3342ffc9b29484d48473d29f1c4a 100644 (file)
@@ -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),
                     };