]> Repositorios git - scryer-prolog.git/commitdiff
clean up compile_seq.
authorMark Thom <[email protected]>
Tue, 27 Feb 2018 00:12:06 +0000 (17:12 -0700)
committerMark Thom <[email protected]>
Tue, 27 Feb 2018 00:12:06 +0000 (17:12 -0700)
src/prolog/codegen.rs
src/prolog/iterators.rs

index 0c12c03a30d993495fe9b5cefa47b63d5cb11d26..33328ec06b9afc683458c104ce34fbfd1551b3c4 100644 (file)
@@ -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 {
index c29fec66638b45d618c53f9f12d8e9f262672219..29035a28f324d30b9c527462b19b70972e486d3f 100644 (file)
@@ -220,8 +220,29 @@ pub struct ChunkedIterator<'a>
     deep_cut_encountered: bool
 }
 
+type ChunkedIteratorItem<'a>  = (usize, usize, Vec<ChunkedTerm<'a>>);
+type RuleBodyIteratorItem<'a> = (usize, usize, Vec<&'a QueryTerm>);
+
 impl<'a> ChunkedIterator<'a>
 {
+    pub fn rule_body_iter(self) -> Box<Iterator<Item=RuleBodyIteratorItem<'a>> + '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<ChunkedTerm<'a>>);
+    type Item = ChunkedIteratorItem<'a>;
 
     fn next(&mut self) -> Option<Self::Item> {
         self.iter.next().map(|term| self.take_chunk(term))