From: Mark Thom Date: Tue, 27 Feb 2018 00:12:06 +0000 (-0700) Subject: clean up compile_seq. X-Git-Tag: v0.8.110~548 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=7906982d4d9326adc6f8f62f3ceda09a02a7bb1f;p=scryer-prolog.git clean up compile_seq. --- diff --git a/src/prolog/codegen.rs b/src/prolog/codegen.rs index 0c12c03a..33328ec0 100644 --- a/src/prolog/codegen.rs +++ b/src/prolog/codegen.rs @@ -466,7 +466,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker> code: &mut Code, is_exposed: bool) -> Result<(), ParserError> { - for (chunk_num, _, terms) in iter + for (chunk_num, _, terms) in iter.rule_body_iter() { for (i, term) in terms.iter().enumerate() { @@ -476,12 +476,6 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker> GenContext::Last(chunk_num) }; - let term = if let &ChunkedTerm::BodyTerm(ref term) = term { - Ok(term) - } else { - Err(ParserError::InadmissibleQueryTerm) - }?; - match *term { &QueryTerm::Cut => code.push(if chunk_num == 0 { diff --git a/src/prolog/iterators.rs b/src/prolog/iterators.rs index c29fec66..29035a28 100644 --- a/src/prolog/iterators.rs +++ b/src/prolog/iterators.rs @@ -220,8 +220,29 @@ pub struct ChunkedIterator<'a> deep_cut_encountered: bool } +type ChunkedIteratorItem<'a> = (usize, usize, Vec>); +type RuleBodyIteratorItem<'a> = (usize, usize, Vec<&'a QueryTerm>); + impl<'a> ChunkedIterator<'a> { + pub fn rule_body_iter(self) -> Box> + 'a> + { + Box::new(self.filter_map(|(cn, lt_arity, terms)| { + let filtered_terms: Vec<_> = terms.into_iter().filter_map(|ct| { + match ct { + ChunkedTerm::BodyTerm(qt) => Some(qt), + _ => None + } + }).collect(); + + if filtered_terms.is_empty() { + None + } else { + Some((cn, lt_arity, filtered_terms)) + } + })) + } + pub fn from_term_sequence(terms: &'a [QueryTerm]) -> Self { ChunkedIterator { @@ -285,7 +306,7 @@ impl<'a> ChunkedIterator<'a> } }, ChunkedTerm::BodyTerm(&QueryTerm::Clause(_, ClauseType::Inlined(_), _)) => - result.push(term), + result.push(term), ChunkedTerm::BodyTerm(&QueryTerm::Clause(_, ClauseType::CallN, ref subterms)) => { result.push(term); arity = subterms.len() + 1; @@ -311,7 +332,7 @@ impl<'a> ChunkedIterator<'a> impl<'a> Iterator for ChunkedIterator<'a> { // the chunk number, last term arity, and vector of references. - type Item = (usize, usize, Vec>); + type Item = ChunkedIteratorItem<'a>; fn next(&mut self) -> Option { self.iter.next().map(|term| self.take_chunk(term))