fix: list clause guard for final clause needs to use list accessor

This commit is contained in:
microproofs 2023-07-06 19:29:40 -04:00 committed by Kasey
parent 2c61ecd4bb
commit b3714ca9d0
2 changed files with 26 additions and 23 deletions

View File

@ -1509,8 +1509,7 @@ impl<'a> CodeGenerator<'a> {
let elems = elements
.iter()
.enumerate()
.zip(defined_tails.iter())
.map(|((index, elem), tail)| {
.map(|(index, elem)| {
let elem_name = match elem {
Pattern::Var { name, .. } => name.to_string(),
Pattern::Assign { name, .. } => name.to_string(),
@ -1535,26 +1534,22 @@ impl<'a> CodeGenerator<'a> {
*complex_clause = *complex_clause || elem_props.complex_clause;
(tail, elem_name, statement)
(elem_name, statement)
})
.collect_vec();
let defined_tail_heads = elems
.iter()
.map(|(tail, head, _)| (tail.to_string(), head.to_string()))
.collect_vec();
let mut defined_heads =
elems.iter().map(|(head, _)| head.to_string()).collect_vec();
let mut air_elems = elems
.into_iter()
.map(|(_, _, statement)| statement)
.map(|(_, statement)| statement)
.collect_vec();
let mut list_tail = None;
tail.iter().for_each(|elem| {
let tail = defined_tails
.last()
.unwrap_or_else(|| panic!("WHERE IS THE TAIL???"));
let tail = defined_tails.last().cloned().unwrap_or_default();
let elem_name = match elem.as_ref() {
Pattern::Var { name, .. } => name.to_string(),
Pattern::Assign { name, .. } => name.to_string(),
@ -1578,15 +1573,28 @@ impl<'a> CodeGenerator<'a> {
*complex_clause = *complex_clause || elem_props.complex_clause;
air_elems.push(statement);
list_tail = Some((tail.to_string(), elem_name));
list_tail = Some((tail, elem_name.to_string()));
defined_heads.push(elem_name)
});
let list_assign = AirTree::list_expose(
defined_tail_heads,
let list_assign = if props.final_clause {
AirTree::list_access(
defined_heads,
subject_tipo.clone(),
tail.is_some(),
false,
AirTree::local_var(&props.original_subject_name, subject_tipo.clone()),
)
} else {
AirTree::list_expose(
defined_heads
.into_iter()
.zip(defined_tails.into_iter())
.collect_vec(),
list_tail,
subject_tipo.clone(),
AirTree::local_var(&props.original_subject_name, subject_tipo.clone()),
);
)
};
let mut sequence = vec![list_assign];

View File

@ -80,7 +80,6 @@ pub enum AirStatement {
tipo: Arc<Type>,
tail_head_names: Vec<(String, String)>,
tail: Option<(String, String)>,
list: Box<AirTree>,
},
// Tuple Access
TupleAccessor {
@ -614,14 +613,12 @@ impl AirTree {
tail_head_names: Vec<(String, String)>,
tail: Option<(String, String)>,
tipo: Arc<Type>,
list: AirTree,
) -> AirTree {
AirTree::Statement {
statement: AirStatement::ListExpose {
tipo,
tail_head_names,
tail,
list: list.into(),
},
hoisted_over: None,
}
@ -854,14 +851,12 @@ impl AirTree {
tipo,
tail_head_names,
tail,
list,
} => {
air_vec.push(Air::ListExpose {
tipo: tipo.clone(),
tail_head_names: tail_head_names.clone(),
tail: tail.clone(),
});
list.create_air_vec(air_vec);
}
AirStatement::TupleAccessor {
names,