Done with list pattern translation. Now to fix up tests

This commit is contained in:
microproofs 2024-10-28 17:57:18 -04:00
parent 8591bedc1e
commit fa203ba9a2
No known key found for this signature in database
GPG Key ID: 14F93C84DE6AFD17
2 changed files with 30 additions and 20 deletions

View File

@ -2568,7 +2568,7 @@ impl<'a> CodeGenerator<'a> {
let last_pattern = if tail_cases.is_empty() { let last_pattern = if tail_cases.is_empty() {
*default.as_ref().unwrap().clone() *default.as_ref().unwrap().clone()
} else { } else {
let (case, tree) = tail_cases.first().unwrap(); let (_case, tree) = tail_cases.first().unwrap();
tree.clone() tree.clone()
}; };
@ -2578,8 +2578,6 @@ impl<'a> CodeGenerator<'a> {
let builtins_for_pattern = let builtins_for_pattern =
builtins_path.merge(Builtins::new_from_list_case(last_case.clone())); builtins_path.merge(Builtins::new_from_list_case(last_case.clone()));
let last_tail_name = builtins_for_pattern.to_string();
stick_set.diff_union_builtins(builtins_for_pattern.clone()); stick_set.diff_union_builtins(builtins_for_pattern.clone());
let last_pattern = self.handle_decision_tree( let last_pattern = self.handle_decision_tree(
@ -2593,7 +2591,7 @@ impl<'a> CodeGenerator<'a> {
let list_clauses = (0..longest_pattern).rev().with_position().fold( let list_clauses = (0..longest_pattern).rev().with_position().fold(
(builtins_for_pattern, last_pattern), (builtins_for_pattern, last_pattern),
|(mut builtins_for_pattern, air), list_item| match list_item { |(mut builtins_for_pattern, acc), list_item| match list_item {
itertools::Position::First(index) | itertools::Position::Only(index) => { itertools::Position::First(index) | itertools::Position::Only(index) => {
let (_, tree) = cases let (_, tree) = cases
.iter() .iter()
@ -2608,7 +2606,11 @@ impl<'a> CodeGenerator<'a> {
(CaseTest::Wild, *default.as_ref().unwrap().clone()) (CaseTest::Wild, *default.as_ref().unwrap().clone())
}); });
let tail_name = builtins_for_pattern.to_string(); let tail_name = if builtins_for_pattern.is_empty() {
subject_name.clone()
} else {
format!("{}_{}", subject_name, builtins_for_pattern.to_string())
};
let then = self.handle_decision_tree( let then = self.handle_decision_tree(
subject_name, subject_name,
@ -2619,18 +2621,18 @@ impl<'a> CodeGenerator<'a> {
stick_set.clone(), stick_set.clone(),
); );
let air = AirTree::list_clause( let acc = AirTree::list_clause(
tail_name.clone(), tail_name.clone(),
subject_tipo.clone(), subject_tipo.clone(),
then, then,
air, AirTree::anon_func(vec![], acc, true),
None, None,
false, false,
); );
builtins_for_pattern.pop(); builtins_for_pattern.pop();
(builtins_for_pattern, air) (builtins_for_pattern, acc)
} }
itertools::Position::Middle(index) | itertools::Position::Last(index) => { itertools::Position::Middle(index) | itertools::Position::Last(index) => {
@ -2647,9 +2649,13 @@ impl<'a> CodeGenerator<'a> {
(CaseTest::Wild, *default.as_ref().unwrap().clone()) (CaseTest::Wild, *default.as_ref().unwrap().clone())
}); });
let tail_name = builtins_for_pattern.to_string(); let tail_name = if builtins_for_pattern.is_empty() {
subject_name.clone()
} else {
format!("{}_{}", subject_name, builtins_for_pattern.to_string())
};
let next_tail_name = Some(format!("{}_tail", last_tail_name)); let next_tail_name = Some(format!("{}_tail", tail_name));
let then = self.handle_decision_tree( let then = self.handle_decision_tree(
subject_name, subject_name,
@ -2660,18 +2666,18 @@ impl<'a> CodeGenerator<'a> {
stick_set.clone(), stick_set.clone(),
); );
let air = AirTree::list_clause( let acc = AirTree::list_clause(
tail_name.clone(), tail_name.clone(),
subject_tipo.clone(), subject_tipo.clone(),
then, then,
air, AirTree::anon_func(vec![], acc, true),
next_tail_name.map(|next| (tail_name, next)), next_tail_name.map(|next| (tail_name, next)),
false, false,
); );
builtins_for_pattern.pop(); builtins_for_pattern.pop();
(builtins_for_pattern, air) (builtins_for_pattern, acc)
} }
}, },
); );
@ -4619,7 +4625,9 @@ impl<'a> CodeGenerator<'a> {
.apply(Term::var(subject_name)), .apply(Term::var(subject_name)),
}; };
condition.if_then_else(body.delay(), other_clauses).force() condition
.delay_true_if_then_else(body, other_clauses)
.force()
}; };
if complex_clause { if complex_clause {
@ -4638,9 +4646,13 @@ impl<'a> CodeGenerator<'a> {
let body = arg_stack.pop().unwrap(); let body = arg_stack.pop().unwrap();
let mut term = arg_stack.pop().unwrap(); let mut term = arg_stack.pop().unwrap();
let arg = if let Some((current_tail, next_tail_name)) = next_tail_name { assert!(matches!(term, Term::Delay(_)));
term.lambda(next_tail_name)
term = if let Some((current_tail, next_tail_name)) = next_tail_name {
term.force()
.lambda(next_tail_name)
.apply(Term::tail_list().apply(Term::var(current_tail.clone()))) .apply(Term::tail_list().apply(Term::var(current_tail.clone())))
.delay()
} else { } else {
term term
}; };
@ -4650,9 +4662,9 @@ impl<'a> CodeGenerator<'a> {
.choose_list(body.delay(), Term::var("__other_clauses_delayed")) .choose_list(body.delay(), Term::var("__other_clauses_delayed"))
.force() .force()
.lambda("__other_clauses_delayed") .lambda("__other_clauses_delayed")
.apply(arg.delay()); .apply(term.delay());
} else { } else {
term = Term::var(tail_name).delayed_choose_list(body, arg); term = Term::var(tail_name).delay_empty_choose_list(body, term);
} }
Some(term) Some(term)

View File

@ -1502,7 +1502,6 @@ mod tester {
let tree = tree_gen.build_tree(&"subject".to_string(), &subject.tipo(), clauses); let tree = tree_gen.build_tree(&"subject".to_string(), &subject.tipo(), clauses);
println!("{}", tree); println!("{}", tree);
panic!("SUPPPPPPPPPPPPPPPPPPPPPPPER DOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONE");
} }
#[test] #[test]
@ -1551,6 +1550,5 @@ mod tester {
let tree = tree_gen.build_tree(&"subject".to_string(), &subject.tipo(), clauses); let tree = tree_gen.build_tree(&"subject".to_string(), &subject.tipo(), clauses);
println!("{}", tree); println!("{}", tree);
panic!("SUPPPPPPPPPPPPPPPPPPPPPPPER DOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONE");
} }
} }