From: Mark Date: Sat, 22 Apr 2023 23:14:00 +0000 (-0600) Subject: discard CodeIndex literals from unfolded control operators in preprocessor (#1791) X-Git-Tag: v0.9.2~145 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=7d2e59ab64fd36ee90195b61a3b6bceb071576a0;p=scryer-prolog.git discard CodeIndex literals from unfolded control operators in preprocessor (#1791) --- diff --git a/src/machine/preprocessor.rs b/src/machine/preprocessor.rs index 37871bb0..7f0cc264 100644 --- a/src/machine/preprocessor.rs +++ b/src/machine/preprocessor.rs @@ -399,7 +399,7 @@ fn check_for_internal_if_then(terms: &mut Vec) { } if let Some(Term::Clause(_, name, ref subterms)) = terms.last() { - if *name != atom!("->") || subterms.len() != 2 { + if *name != atom!("->") || source_arity(subterms) != 2 { return; } } else { @@ -770,7 +770,7 @@ impl Preprocessor { Term::Var(_, ref v) if v.as_str() == "!" => { Ok(QueryTerm::UnblockedCut(Cell::default())) } - Term::Clause(r, name, mut terms) => match (name, terms.len()) { + Term::Clause(r, name, mut terms) => match (name, source_arity(&terms)) { (atom!(";"), 2) => { let term = Term::Clause(r, name, terms); @@ -900,7 +900,7 @@ impl Preprocessor { let mut term = term; if let Term::Clause(cell, name, terms) = term { - if name == atom!(",") && terms.len() == 2 { + if name == atom!(",") && source_arity(&terms) == 2 { let term = Term::Clause(cell, name, terms); let mut subterms = unfold_by_str(term, atom!(",")); diff --git a/src/parser/ast.rs b/src/parser/ast.rs index b1c0f5d9..0933b11c 100644 --- a/src/parser/ast.rs +++ b/src/parser/ast.rs @@ -626,8 +626,25 @@ impl Term { } } +#[inline] +pub fn source_arity(terms: &[Term]) -> usize { + if let Some(last_arg) = terms.last() { + if let Term::Literal(_, Literal::CodeIndex(_)) = last_arg { + return terms.len() - 1; + } + } + + terms.len() +} + fn unfold_by_str_once(term: &mut Term, s: Atom) -> Option<(Term, Term)> { if let Term::Clause(_, ref name, ref mut subterms) = term { + if let Some(last_arg) = subterms.last() { + if let Term::Literal(_, Literal::CodeIndex(_)) = last_arg { + subterms.pop(); + } + } + if name == &s && subterms.len() == 2 { let snd = subterms.pop().unwrap(); let fst = subterms.pop().unwrap();