From: Mark Thom Date: Tue, 16 Oct 2018 02:07:22 +0000 (-0600) Subject: add expand_term/2 X-Git-Tag: v0.8.110~333 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=eabb851d8ce216999c343887005a8eb5f04703cd;p=scryer-prolog.git add expand_term/2 --- diff --git a/README.md b/README.md index 16e6341c..c62fbf7f 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,7 @@ The following predicates are built-in to rusty-wam. * `compound/1` * `copy_term/2` * `cyclic_term/1` +* `expand_term/2` * `false/0` * `float/1` * `functor/3` diff --git a/src/prolog/instructions.rs b/src/prolog/instructions.rs index b7be416e..0a7723e4 100644 --- a/src/prolog/instructions.rs +++ b/src/prolog/instructions.rs @@ -217,6 +217,7 @@ pub struct Module { #[derive(Copy, Clone, PartialEq)] pub enum SystemClauseType { CheckCutPoint, + ExpandTerm, GetBValue, GetSCCCleaner, InstallSCCCleaner, @@ -252,6 +253,7 @@ impl SystemClauseType { pub fn name(&self) -> ClauseName { match self { &SystemClauseType::CheckCutPoint => clause_name!("$check_cp"), + &SystemClauseType::ExpandTerm => clause_name!("$expand_term"), &SystemClauseType::GetBValue => clause_name!("$get_b_value"), &SystemClauseType::GetDoubleQuotes => clause_name!("$get_double_quotes"), &SystemClauseType::GetSCCCleaner => clause_name!("$get_scc_cleaner"), @@ -286,6 +288,7 @@ impl SystemClauseType { pub fn from(name: &str, arity: usize) -> Option { match (name, arity) { ("$check_cp", 1) => Some(SystemClauseType::CheckCutPoint), + ("$expand_term", 2) => Some(SystemClauseType::ExpandTerm), ("$get_b_value", 1) => Some(SystemClauseType::GetBValue), ("$get_double_quotes", 1) => Some(SystemClauseType::GetDoubleQuotes), ("$get_scc_cleaner", 1) => Some(SystemClauseType::GetSCCCleaner), diff --git a/src/prolog/lib/dcgs.pl b/src/prolog/lib/dcgs.pl index bbb9f5d2..0d8eb076 100644 --- a/src/prolog/lib/dcgs.pl +++ b/src/prolog/lib/dcgs.pl @@ -43,6 +43,7 @@ term_expansion(Term0, (ModHead :- ModBody)) :- expand_body(Term0, (ModTerm, ModTerms), N0, N) :- nonvar(Term0), Term0 = (Term, Terms), !, + nonvar(Term), expand_body_term(Term, ModTerm, N0, N1), expand_body(Terms, ModTerms, N1, N). expand_body(Term0, ModTerm, N0, N) :- diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index f193e034..a86835b6 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -190,7 +190,7 @@ impl MachineState { pub(super) fn system_call(&mut self, ct: &SystemClauseType, indices: &IndexStore, call_policy: &mut Box, - cut_policy: &mut Box,) + cut_policy: &mut Box) -> CallResult { match ct { @@ -202,6 +202,10 @@ impl MachineState { _ => self.fail = true }; }, + &SystemClauseType::ExpandTerm => { + self.p = CodePtr::Local(LocalCodePtr::UserTermExpansion(0)); + return Ok(()); + }, &SystemClauseType::GetDoubleQuotes => { let a1 = self[temp_v!(1)].clone();