Revert "fix: nested list issues in when statements"
This reverts commit 542962a2ea.
			
			
This commit is contained in:
		
							parent
							
								
									613fb3c957
								
							
						
					
					
						commit
						4b34617466
					
				|  | @ -134,6 +134,7 @@ pub enum Air { | |||
|         tail_name: String, | ||||
|         next_tail_name: Option<String>, | ||||
|         complex_clause: bool, | ||||
|         inverse: bool, | ||||
|     }, | ||||
| 
 | ||||
|     TupleClause { | ||||
|  | @ -152,14 +153,6 @@ pub enum Air { | |||
|         tipo: Arc<Type>, | ||||
|     }, | ||||
| 
 | ||||
|     ListClauseGuard { | ||||
|         scope: Vec<u64>, | ||||
|         tipo: Arc<Type>, | ||||
|         tail_name: String, | ||||
|         next_tail_name: Option<String>, | ||||
|         inverse: bool, | ||||
|     }, | ||||
| 
 | ||||
|     Discard { | ||||
|         scope: Vec<u64>, | ||||
|     }, | ||||
|  | @ -271,7 +264,6 @@ impl Air { | |||
|             | Air::Clause { scope, .. } | ||||
|             | Air::ListClause { scope, .. } | ||||
|             | Air::ClauseGuard { scope, .. } | ||||
|             | Air::ListClauseGuard { scope, .. } | ||||
|             | Air::Discard { scope } | ||||
|             | Air::Finally { scope } | ||||
|             | Air::If { scope, .. } | ||||
|  |  | |||
|  | @ -1283,6 +1283,7 @@ pub fn monomorphize( | |||
|                 tail_name, | ||||
|                 complex_clause, | ||||
|                 next_tail_name, | ||||
|                 inverse, | ||||
|             } => { | ||||
|                 if tipo.is_generic() { | ||||
|                     let mut tipo = tipo.clone(); | ||||
|  | @ -1294,6 +1295,7 @@ pub fn monomorphize( | |||
|                         tail_name, | ||||
|                         complex_clause, | ||||
|                         next_tail_name, | ||||
|                         inverse, | ||||
|                     }; | ||||
|                     needs_variant = false; | ||||
|                 } | ||||
|  | @ -1315,27 +1317,6 @@ pub fn monomorphize( | |||
|                     needs_variant = false; | ||||
|                 } | ||||
|             } | ||||
|             Air::ListClauseGuard { | ||||
|                 scope, | ||||
|                 tipo, | ||||
|                 tail_name, | ||||
|                 next_tail_name, | ||||
|                 inverse, | ||||
|             } => { | ||||
|                 if tipo.is_generic() { | ||||
|                     let mut tipo = tipo.clone(); | ||||
|                     find_generics_to_replace(&mut tipo, &generic_types); | ||||
| 
 | ||||
|                     new_air[index] = Air::ListClauseGuard { | ||||
|                         scope, | ||||
|                         tipo, | ||||
|                         tail_name, | ||||
|                         next_tail_name, | ||||
|                         inverse, | ||||
|                     }; | ||||
|                     needs_variant = false; | ||||
|                 } | ||||
|             } | ||||
|             Air::RecordAccess { | ||||
|                 scope, | ||||
|                 index: record_index, | ||||
|  |  | |||
|  | @ -617,6 +617,7 @@ impl<'a> CodeGenerator<'a> { | |||
|                         tail_name: subject_name, | ||||
|                         next_tail_name: next_tail, | ||||
|                         complex_clause: *clause_properties.is_complex_clause(), | ||||
|                         inverse: false, | ||||
|                     }); | ||||
| 
 | ||||
|                     match clause_properties { | ||||
|  | @ -757,6 +758,10 @@ impl<'a> CodeGenerator<'a> { | |||
|                 } | ||||
|                 *clause_properties.needs_constr_var() = false; | ||||
| 
 | ||||
|                 pattern_vec.push(Air::Discard { | ||||
|                     scope: scope.clone(), | ||||
|                 }); | ||||
| 
 | ||||
|                 self.when_recursive_ir( | ||||
|                     pattern, | ||||
|                     pattern_vec, | ||||
|  | @ -1186,12 +1191,29 @@ impl<'a> CodeGenerator<'a> { | |||
|                 let new_tail_name = "__list_tail".to_string(); | ||||
| 
 | ||||
|                 if elements.is_empty() { | ||||
|                     pattern_vec.push(Air::ListClauseGuard { | ||||
|                         scope, | ||||
|                     pattern_vec.push(Air::ListClause { | ||||
|                         scope: scope.clone(), | ||||
|                         tipo: pattern_type.clone(), | ||||
|                         tail_name: item_name.clone(), | ||||
|                         next_tail_name: None, | ||||
|                         inverse: false, | ||||
|                         complex_clause: false, | ||||
|                         inverse: true, | ||||
|                     }); | ||||
| 
 | ||||
|                     pattern_vec.push(Air::Discard { | ||||
|                         scope: scope.clone(), | ||||
|                     }); | ||||
| 
 | ||||
|                     pattern_vec.push(Air::Var { | ||||
|                         scope, | ||||
|                         constructor: ValueConstructor::public( | ||||
|                             pattern_type.clone(), | ||||
|                             ValueConstructorVariant::LocalVariable { | ||||
|                                 location: Span::empty(), | ||||
|                             }, | ||||
|                         ), | ||||
|                         name: "__other_clauses_delayed".to_string(), | ||||
|                         variant_name: String::new(), | ||||
|                     }); | ||||
|                 } else { | ||||
|                     for (index, _) in elements.iter().enumerate() { | ||||
|  | @ -1219,12 +1241,29 @@ impl<'a> CodeGenerator<'a> { | |||
|                                     _ => unreachable!(), | ||||
|                                 }; | ||||
| 
 | ||||
|                                 pattern_vec.push(Air::ListClauseGuard { | ||||
|                                 pattern_vec.push(Air::ListClause { | ||||
|                                     scope: scope.clone(), | ||||
|                                     tipo: pattern_type.clone(), | ||||
|                                     tail_name: prev_tail_name, | ||||
|                                     next_tail_name: Some(tail_name), | ||||
|                                     inverse: true, | ||||
|                                     complex_clause: false, | ||||
|                                     inverse: false, | ||||
|                                 }); | ||||
| 
 | ||||
|                                 pattern_vec.push(Air::Discard { | ||||
|                                     scope: scope.clone(), | ||||
|                                 }); | ||||
| 
 | ||||
|                                 pattern_vec.push(Air::Var { | ||||
|                                     scope: scope.clone(), | ||||
|                                     constructor: ValueConstructor::public( | ||||
|                                         pattern_type.clone(), | ||||
|                                         ValueConstructorVariant::LocalVariable { | ||||
|                                             location: Span::empty(), | ||||
|                                         }, | ||||
|                                     ), | ||||
|                                     name: "__other_clauses_delayed".to_string(), | ||||
|                                     variant_name: "".to_string(), | ||||
|                                 }); | ||||
| 
 | ||||
|                                 self.when_ir( | ||||
|  | @ -1236,20 +1275,54 @@ impl<'a> CodeGenerator<'a> { | |||
|                                     scope.clone(), | ||||
|                                 ); | ||||
|                             } else { | ||||
|                                 pattern_vec.push(Air::ListClauseGuard { | ||||
|                                 pattern_vec.push(Air::ListClause { | ||||
|                                     scope: scope.clone(), | ||||
|                                     tipo: pattern_type.clone(), | ||||
|                                     tail_name: prev_tail_name, | ||||
|                                     next_tail_name: Some(tail_name.clone()), | ||||
|                                     inverse: true, | ||||
|                                     complex_clause: false, | ||||
|                                     inverse: false, | ||||
|                                 }); | ||||
| 
 | ||||
|                                 pattern_vec.push(Air::ListClauseGuard { | ||||
|                                 pattern_vec.push(Air::Discard { | ||||
|                                     scope: scope.clone(), | ||||
|                                 }); | ||||
| 
 | ||||
|                                 pattern_vec.push(Air::Var { | ||||
|                                     scope: scope.clone(), | ||||
|                                     constructor: ValueConstructor::public( | ||||
|                                         pattern_type.clone(), | ||||
|                                         ValueConstructorVariant::LocalVariable { | ||||
|                                             location: Span::empty(), | ||||
|                                         }, | ||||
|                                     ), | ||||
|                                     name: "__other_clauses_delayed".to_string(), | ||||
|                                     variant_name: String::new(), | ||||
|                                 }); | ||||
| 
 | ||||
|                                 pattern_vec.push(Air::ListClause { | ||||
|                                     scope: scope.clone(), | ||||
|                                     tipo: pattern_type.clone(), | ||||
|                                     tail_name: tail_name.clone(), | ||||
|                                     next_tail_name: None, | ||||
|                                     inverse: false, | ||||
|                                     complex_clause: false, | ||||
|                                     inverse: true, | ||||
|                                 }); | ||||
| 
 | ||||
|                                 pattern_vec.push(Air::Discard { | ||||
|                                     scope: scope.clone(), | ||||
|                                 }); | ||||
| 
 | ||||
|                                 pattern_vec.push(Air::Var { | ||||
|                                     scope: scope.clone(), | ||||
|                                     constructor: ValueConstructor::public( | ||||
|                                         pattern_type.clone(), | ||||
|                                         ValueConstructorVariant::LocalVariable { | ||||
|                                             location: Span::empty(), | ||||
|                                         }, | ||||
|                                     ), | ||||
|                                     name: "__other_clauses_delayed".to_string(), | ||||
|                                     variant_name: String::new(), | ||||
|                                 }); | ||||
| 
 | ||||
|                                 self.when_ir( | ||||
|  | @ -1268,12 +1341,29 @@ impl<'a> CodeGenerator<'a> { | |||
|                                 _ => unreachable!(), | ||||
|                             }; | ||||
| 
 | ||||
|                             pattern_vec.push(Air::ListClauseGuard { | ||||
|                             pattern_vec.push(Air::ListClause { | ||||
|                                 scope: scope.clone(), | ||||
|                                 tipo: pattern_type.clone(), | ||||
|                                 tail_name: prev_tail_name, | ||||
|                                 next_tail_name: Some(tail_name), | ||||
|                                 inverse: true, | ||||
|                                 complex_clause: false, | ||||
|                                 inverse: false, | ||||
|                             }); | ||||
| 
 | ||||
|                             pattern_vec.push(Air::Discard { | ||||
|                                 scope: scope.clone(), | ||||
|                             }); | ||||
| 
 | ||||
|                             pattern_vec.push(Air::Var { | ||||
|                                 scope: scope.clone(), | ||||
|                                 constructor: ValueConstructor::public( | ||||
|                                     pattern_type.clone(), | ||||
|                                     ValueConstructorVariant::LocalVariable { | ||||
|                                         location: Span::empty(), | ||||
|                                     }, | ||||
|                                 ), | ||||
|                                 name: "__other_clauses_delayed".to_string(), | ||||
|                                 variant_name: "".to_string(), | ||||
|                             }); | ||||
| 
 | ||||
|                             self.when_ir( | ||||
|  | @ -3392,6 +3482,7 @@ impl<'a> CodeGenerator<'a> { | |||
|                         .into(), | ||||
|                         argument: Term::Delay(term.into()).into(), | ||||
|                     } | ||||
|                     .force_wrap() | ||||
|                 } else { | ||||
|                     term = delayed_if_else( | ||||
|                         Term::Apply { | ||||
|  | @ -3408,11 +3499,26 @@ impl<'a> CodeGenerator<'a> { | |||
|             Air::ListClause { | ||||
|                 tail_name, | ||||
|                 next_tail_name, | ||||
|                 inverse, | ||||
|                 complex_clause, | ||||
|                 .. | ||||
|             } => { | ||||
|                 let body = arg_stack.pop().unwrap(); | ||||
|                 let mut term = arg_stack.pop().unwrap(); | ||||
|                 // discard to pop off
 | ||||
|                 let _ = arg_stack.pop().unwrap(); | ||||
| 
 | ||||
|                 // the body to be run if the clause matches
 | ||||
|                 // the next branch in the when expression
 | ||||
|                 let (body, mut term) = if inverse { | ||||
|                     let term = arg_stack.pop().unwrap(); | ||||
|                     let body = arg_stack.pop().unwrap(); | ||||
| 
 | ||||
|                     (body, term) | ||||
|                 } else { | ||||
|                     let body = arg_stack.pop().unwrap(); | ||||
|                     let term = arg_stack.pop().unwrap(); | ||||
| 
 | ||||
|                     (body, term) | ||||
|                 }; | ||||
| 
 | ||||
|                 let arg = if let Some(next_tail_name) = next_tail_name { | ||||
|                     Term::Apply { | ||||
|  | @ -3513,7 +3619,7 @@ impl<'a> CodeGenerator<'a> { | |||
|                         .into(), | ||||
|                     } | ||||
|                 } else if tipo.is_list() { | ||||
|                     unreachable!() | ||||
|                     todo!() | ||||
|                 } else { | ||||
|                     Term::Apply { | ||||
|                         function: DefaultFunction::EqualsInteger.into(), | ||||
|  | @ -3540,70 +3646,6 @@ impl<'a> CodeGenerator<'a> { | |||
| 
 | ||||
|                 arg_stack.push(term); | ||||
|             } | ||||
|             Air::ListClauseGuard { | ||||
|                 tail_name, | ||||
|                 next_tail_name, | ||||
|                 inverse, | ||||
|                 .. | ||||
|             } => { | ||||
|                 // the body to be run if the clause matches
 | ||||
|                 // the next branch in the when expression
 | ||||
|                 let mut term = arg_stack.pop().unwrap(); | ||||
| 
 | ||||
|                 term = if let Some(next_tail_name) = next_tail_name { | ||||
|                     Term::Apply { | ||||
|                         function: Term::Lambda { | ||||
|                             parameter_name: Name { | ||||
|                                 text: next_tail_name, | ||||
|                                 unique: 0.into(), | ||||
|                             }, | ||||
|                             body: term.into(), | ||||
|                         } | ||||
|                         .into(), | ||||
|                         argument: Term::Apply { | ||||
|                             function: Term::Builtin(DefaultFunction::TailList).force_wrap().into(), | ||||
|                             argument: Term::Var(Name { | ||||
|                                 text: tail_name.clone(), | ||||
|                                 unique: 0.into(), | ||||
|                             }) | ||||
|                             .into(), | ||||
|                         } | ||||
|                         .into(), | ||||
|                     } | ||||
|                 } else { | ||||
|                     term | ||||
|                 }; | ||||
| 
 | ||||
|                 if !inverse { | ||||
|                     term = choose_list( | ||||
|                         Term::Var(Name { | ||||
|                             text: tail_name, | ||||
|                             unique: 0.into(), | ||||
|                         }), | ||||
|                         Term::Delay(term.into()), | ||||
|                         Term::Var(Name { | ||||
|                             text: "__other_clauses_delayed".to_string(), | ||||
|                             unique: 0.into(), | ||||
|                         }), | ||||
|                     ) | ||||
|                     .force_wrap(); | ||||
|                 } else { | ||||
|                     term = choose_list( | ||||
|                         Term::Var(Name { | ||||
|                             text: tail_name, | ||||
|                             unique: 0.into(), | ||||
|                         }), | ||||
|                         Term::Var(Name { | ||||
|                             text: "__other_clauses_delayed".to_string(), | ||||
|                             unique: 0.into(), | ||||
|                         }), | ||||
|                         Term::Delay(term.into()), | ||||
|                     ) | ||||
|                     .force_wrap(); | ||||
|                 } | ||||
| 
 | ||||
|                 arg_stack.push(term); | ||||
|             } | ||||
|             Air::Finally { .. } => { | ||||
|                 let _clause = arg_stack.pop().unwrap(); | ||||
|             } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 KtorZ
						KtorZ