]> Repositorios git - scryer-prolog.git/commitdiff
Simplified the code, removed first_arg, the Option
authornotoria <[email protected]>
Sat, 19 Dec 2020 20:04:17 +0000 (21:04 +0100)
committernotoria <[email protected]>
Sat, 19 Dec 2020 20:04:17 +0000 (21:04 +0100)
src/codegen.rs
src/forms.rs
src/indexing.rs

index 56128edccff23910dd2c6faf39d0a5d3b2974add..eb68ae8b46196c269603fe6f2274c9f83bf12d6d 100644 (file)
@@ -857,16 +857,14 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
         Ok(code)
     }
 
-    fn split_predicate(clauses: &Vec<PredicateClause>, optimal_index: Option<usize>) -> Vec<(usize, usize)> {
+    fn split_predicate(clauses: &Vec<PredicateClause>, optimal_index: usize) -> Vec<(usize, usize)> {
         let mut subseqs = Vec::new();
         let mut left_index = 0;
 
-        if let Some(optimal_i) = optimal_index {
+        if clauses.first().unwrap().args().is_some() {
             for (right_index, clause) in clauses.iter().enumerate() {
-                if clause.args().is_none() {
-                    continue;
-                }
-                if let Some(arg) = clause.args().unwrap().iter().nth(optimal_i) {
+                // Can unwrap safely.
+                if let Some(arg) = clause.args().unwrap().iter().nth(optimal_index) {
                     match **arg {
                         Term::Var(..) | Term::AnonVar => {
                             if left_index < right_index {
@@ -908,7 +906,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
     fn compile_pred_subseq<'b: 'a>(
         &mut self,
         clauses: &'b [PredicateClause],
-        optimal_index: Option<usize>,
+        optimal_index: usize,
     ) -> Result<Code, ParserError> {
         let mut code_body = Vec::new();
         let mut code_offsets = CodeOffsets::new();
@@ -933,18 +931,16 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
                 code_body.push(Line::Choice(choice));
             }
 
-            if let Some(optimal_i) = optimal_index {
-                let arg = match clause.args() {
-                    Some(args) => match args.iter().nth(optimal_i) {
-                        Some(term) => Some(term),
-                        None => None,
-                    },
+            let arg = match clause.args() {
+                Some(args) => match args.iter().nth(optimal_index) {
+                    Some(term) => Some(term),
                     None => None,
-                };
-                if let Some(arg) = arg {
-                    let index = code_body.len();
-                    code_offsets.index_term(arg, index);
-                }
+                },
+                None => None,
+            };
+            if let Some(arg) = arg {
+                let index = code_body.len();
+                code_offsets.index_term(arg, index);
             }
 
             code_body.append(&mut clause_code);
@@ -952,9 +948,8 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
 
         let mut code = Vec::new();
 
-        if let Some(optimal_i) = optimal_index {
-            code_offsets.add_indices(&mut code, code_body, optimal_i + 1);
-        }
+        code_offsets.add_indices(&mut code, code_body, optimal_index + 1);
+
         Ok(code)
     }
 
@@ -993,12 +988,10 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
                 }
             }
         }
-        match optimal_index {
-            // No good index or no argument, default to 0.
-            // TODO: Why?
-            None => optimal_index = Some(0),
-            Some(_) => (),
-        }
+        let optimal_index = match optimal_index {
+            Some(optimal_index) => optimal_index,
+            None => 0,  // Default to first argument indexing.
+        };
         let split_pred = Self::split_predicate(&clauses, optimal_index);
         let multi_seq = split_pred.len() > 1;
 
index 5a7fcd2b8e05e69f7061fcb74f4773c4ba4afd06..be572bc4c9c6cc89387f4281f260c06f14c33ccc 100644 (file)
@@ -332,13 +332,6 @@ pub enum PredicateClause {
 }
 
 impl PredicateClause {
-    pub fn first_arg(&self) -> Option<&Term> {
-        match self {
-            &PredicateClause::Fact(ref term, ..) => term.first_arg(),
-            &PredicateClause::Rule(ref rule, ..) => rule.head.1.first().map(|bt| bt.as_ref()),
-        }
-    }
-
     // TODO: add this to `Term` in `prolog_parser` like `first_arg`.
     pub fn args(&self) -> Option<&[Box<Term>]> {
         match *self {
index ccd6371746f8d9c4fbc203fb491fe2abad646ff6..bf5403bf64e762f59016f20b7f1ab903761c5759 100644 (file)
@@ -143,8 +143,8 @@ impl CodeOffsets {
         }
     }
 
-    pub fn index_term(&mut self, first_arg: &Term, index: usize) {
-        match first_arg {
+    pub fn index_term(&mut self, optimal_arg: &Term, index: usize) {
+        match optimal_arg {
             &Term::Clause(_, ref name, ref terms, _) => {
                 let code = self
                     .structures