feat: uplc code gen for functions and minor recursion fix
This commit is contained in:
parent
8f984ad131
commit
3d3beef7d4
|
@ -352,7 +352,9 @@ impl<'a> CodeGenerator<'a> {
|
||||||
ir_stack.append(&mut pattern_vec);
|
ir_stack.append(&mut pattern_vec);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
TypedExpr::If { .. } => todo!(),
|
TypedExpr::If { .. } => {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
TypedExpr::RecordAccess {
|
TypedExpr::RecordAccess {
|
||||||
record,
|
record,
|
||||||
index,
|
index,
|
||||||
|
@ -460,10 +462,25 @@ impl<'a> CodeGenerator<'a> {
|
||||||
pattern_vec.append(values);
|
pattern_vec.append(values);
|
||||||
}
|
}
|
||||||
Pattern::String { .. } => todo!(),
|
Pattern::String { .. } => todo!(),
|
||||||
Pattern::Var { .. } => todo!(),
|
Pattern::Var { name, .. } => {
|
||||||
|
pattern_vec.push(IR::Var {
|
||||||
|
scope,
|
||||||
|
name: name.clone(),
|
||||||
|
constructor: ValueConstructor::public(
|
||||||
|
tipo.clone().into(),
|
||||||
|
ValueConstructorVariant::LocalVariable {
|
||||||
|
location: Span::empty(),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
});
|
||||||
|
pattern_vec.append(values);
|
||||||
|
}
|
||||||
Pattern::VarUsage { .. } => todo!(),
|
Pattern::VarUsage { .. } => todo!(),
|
||||||
Pattern::Assign { .. } => todo!(),
|
Pattern::Assign { .. } => todo!(),
|
||||||
Pattern::Discard { .. } => unreachable!(),
|
Pattern::Discard { .. } => {
|
||||||
|
pattern_vec.push(IR::Discard { scope });
|
||||||
|
pattern_vec.append(values);
|
||||||
|
}
|
||||||
Pattern::List { .. } => todo!(),
|
Pattern::List { .. } => todo!(),
|
||||||
Pattern::Constructor { arguments, .. } => {
|
Pattern::Constructor { arguments, .. } => {
|
||||||
let mut needs_access_to_constr_var = false;
|
let mut needs_access_to_constr_var = false;
|
||||||
|
@ -1082,11 +1099,108 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
arg_stack.push(term);
|
arg_stack.push(term);
|
||||||
}
|
}
|
||||||
IR::DefineFunc { .. } => {
|
IR::DefineFunc {
|
||||||
let _func_body = arg_stack.pop().unwrap();
|
func_name,
|
||||||
|
params,
|
||||||
|
recursive,
|
||||||
|
..
|
||||||
|
} => {
|
||||||
|
let mut func_body = arg_stack.pop().unwrap();
|
||||||
|
|
||||||
let _term = arg_stack.pop().unwrap();
|
let mut term = arg_stack.pop().unwrap();
|
||||||
todo!()
|
|
||||||
|
for param in params.iter().rev() {
|
||||||
|
func_body = Term::Lambda {
|
||||||
|
parameter_name: Name {
|
||||||
|
text: param.clone(),
|
||||||
|
unique: 0.into(),
|
||||||
|
},
|
||||||
|
body: func_body.into(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if !recursive {
|
||||||
|
term = Term::Apply {
|
||||||
|
function: Term::Lambda {
|
||||||
|
parameter_name: Name {
|
||||||
|
text: func_name,
|
||||||
|
unique: 0.into(),
|
||||||
|
},
|
||||||
|
body: term.into(),
|
||||||
|
}
|
||||||
|
.into(),
|
||||||
|
argument: func_body.into(),
|
||||||
|
};
|
||||||
|
arg_stack.push(term);
|
||||||
|
} else {
|
||||||
|
func_body = Term::Lambda {
|
||||||
|
parameter_name: Name {
|
||||||
|
text: func_name.clone(),
|
||||||
|
unique: 0.into(),
|
||||||
|
},
|
||||||
|
body: func_body.into(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut boostrap_recurse = Term::Apply {
|
||||||
|
function: Term::Var(Name {
|
||||||
|
text: "__recurse".to_string(),
|
||||||
|
unique: 0.into(),
|
||||||
|
})
|
||||||
|
.into(),
|
||||||
|
argument: Term::Var(Name {
|
||||||
|
text: "__recurse".to_string(),
|
||||||
|
unique: 0.into(),
|
||||||
|
})
|
||||||
|
.into(),
|
||||||
|
};
|
||||||
|
|
||||||
|
for param in params.iter() {
|
||||||
|
boostrap_recurse = Term::Apply {
|
||||||
|
function: boostrap_recurse.into(),
|
||||||
|
argument: Term::Var(Name {
|
||||||
|
text: param.clone(),
|
||||||
|
unique: 0.into(),
|
||||||
|
})
|
||||||
|
.into(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
func_body = Term::Apply {
|
||||||
|
function: Term::Lambda {
|
||||||
|
parameter_name: Name {
|
||||||
|
text: "__recurse".to_string(),
|
||||||
|
unique: 0.into(),
|
||||||
|
},
|
||||||
|
body: boostrap_recurse.into(),
|
||||||
|
}
|
||||||
|
.into(),
|
||||||
|
argument: func_body.into(),
|
||||||
|
};
|
||||||
|
|
||||||
|
for param in params.iter().rev() {
|
||||||
|
func_body = Term::Lambda {
|
||||||
|
parameter_name: Name {
|
||||||
|
text: param.clone(),
|
||||||
|
unique: 0.into(),
|
||||||
|
},
|
||||||
|
body: func_body.into(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
term = Term::Apply {
|
||||||
|
function: Term::Lambda {
|
||||||
|
parameter_name: Name {
|
||||||
|
text: func_name,
|
||||||
|
unique: 0.into(),
|
||||||
|
},
|
||||||
|
body: term.into(),
|
||||||
|
}
|
||||||
|
.into(),
|
||||||
|
argument: func_body.into(),
|
||||||
|
};
|
||||||
|
|
||||||
|
arg_stack.push(term);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
IR::DefineConst { .. } => todo!(),
|
IR::DefineConst { .. } => todo!(),
|
||||||
IR::DefineConstrFields { .. } => todo!(),
|
IR::DefineConstrFields { .. } => todo!(),
|
||||||
|
@ -1520,11 +1634,18 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut func_components = IndexMap::new();
|
let mut func_components = IndexMap::new();
|
||||||
let mut func_index_map = IndexMap::new();
|
let mut func_index_map = IndexMap::new();
|
||||||
|
|
||||||
self.define_recurse_ir(ir_stack, &mut func_components, &mut func_index_map);
|
let recursion_func_map = IndexMap::new();
|
||||||
|
|
||||||
|
self.define_recurse_ir(
|
||||||
|
ir_stack,
|
||||||
|
&mut func_components,
|
||||||
|
&mut func_index_map,
|
||||||
|
recursion_func_map,
|
||||||
|
);
|
||||||
|
|
||||||
let mut final_func_dep_ir = IndexMap::new();
|
let mut final_func_dep_ir = IndexMap::new();
|
||||||
|
|
||||||
println!("FINAL FUNC MAP IS {:#?}", func_index_map);
|
println!("GOT HERE");
|
||||||
|
|
||||||
for func in func_index_map.clone() {
|
for func in func_index_map.clone() {
|
||||||
if self.defined_functions.contains_key(&func.0) {
|
if self.defined_functions.contains_key(&func.0) {
|
||||||
|
@ -1589,8 +1710,6 @@ impl<'a> CodeGenerator<'a> {
|
||||||
func_index_map.remove(item.0);
|
func_index_map.remove(item.0);
|
||||||
self.defined_functions.insert(item.0.clone(), ());
|
self.defined_functions.insert(item.0.clone(), ());
|
||||||
|
|
||||||
println!("INSERTING HERE {item:#?} AT {a:#?}");
|
|
||||||
|
|
||||||
let mut full_func_ir = final_func_dep_ir.get(item.0).unwrap().clone();
|
let mut full_func_ir = final_func_dep_ir.get(item.0).unwrap().clone();
|
||||||
|
|
||||||
let funt_comp = func_components.get(item.0).unwrap();
|
let funt_comp = func_components.get(item.0).unwrap();
|
||||||
|
@ -1619,15 +1738,50 @@ impl<'a> CodeGenerator<'a> {
|
||||||
ir_stack: &[IR],
|
ir_stack: &[IR],
|
||||||
func_components: &mut IndexMap<FunctionAccessKey, FuncComponents>,
|
func_components: &mut IndexMap<FunctionAccessKey, FuncComponents>,
|
||||||
func_index_map: &mut IndexMap<FunctionAccessKey, Vec<u64>>,
|
func_index_map: &mut IndexMap<FunctionAccessKey, Vec<u64>>,
|
||||||
|
recursion_func_map: IndexMap<FunctionAccessKey, ()>,
|
||||||
) {
|
) {
|
||||||
self.process_define_ir(ir_stack, func_components, func_index_map);
|
self.process_define_ir(ir_stack, func_components, func_index_map);
|
||||||
|
|
||||||
|
let mut recursion_func_map = recursion_func_map;
|
||||||
|
|
||||||
for func_index in func_index_map.clone().iter() {
|
for func_index in func_index_map.clone().iter() {
|
||||||
let func = func_index.0;
|
let func = func_index.0;
|
||||||
|
|
||||||
let function_components = func_components.get(func).unwrap();
|
let function_components = func_components.get(func).unwrap();
|
||||||
let function_ir = function_components.ir.clone();
|
let function_ir = function_components.ir.clone();
|
||||||
|
|
||||||
|
for ir in function_ir.clone() {
|
||||||
|
if let IR::Var {
|
||||||
|
constructor:
|
||||||
|
ValueConstructor {
|
||||||
|
variant:
|
||||||
|
ValueConstructorVariant::ModuleFn {
|
||||||
|
name: func_name,
|
||||||
|
module,
|
||||||
|
..
|
||||||
|
},
|
||||||
|
..
|
||||||
|
},
|
||||||
|
..
|
||||||
|
} = ir
|
||||||
|
{
|
||||||
|
if recursion_func_map.contains_key(&FunctionAccessKey {
|
||||||
|
module_name: module.clone(),
|
||||||
|
function_name: func_name.clone(),
|
||||||
|
}) {
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
recursion_func_map.insert(
|
||||||
|
FunctionAccessKey {
|
||||||
|
module_name: module.clone(),
|
||||||
|
function_name: func_name.clone(),
|
||||||
|
},
|
||||||
|
(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mut inner_func_components = IndexMap::new();
|
let mut inner_func_components = IndexMap::new();
|
||||||
|
|
||||||
let mut inner_func_index_map = IndexMap::new();
|
let mut inner_func_index_map = IndexMap::new();
|
||||||
|
@ -1636,6 +1790,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
&function_ir,
|
&function_ir,
|
||||||
&mut inner_func_components,
|
&mut inner_func_components,
|
||||||
&mut inner_func_index_map,
|
&mut inner_func_index_map,
|
||||||
|
recursion_func_map.clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
//now unify
|
//now unify
|
||||||
|
@ -1652,96 +1807,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
func_index_map.insert(item.0, item.1);
|
func_index_map.insert(item.0, item.1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// let mut sorted_functions = vec![];
|
|
||||||
// let func = func_index.0;
|
|
||||||
// let scope = func_index.1;
|
|
||||||
|
|
||||||
// let function_components = func_components.get(func).unwrap();
|
|
||||||
// let dependencies = function_components.dependencies.clone();
|
|
||||||
// let function_ir = function_components.ir.clone();
|
|
||||||
|
|
||||||
// let mut nested_func_components = func_components.clone();
|
|
||||||
// let mut nested_func_index_map = func_index_map.clone();
|
|
||||||
|
|
||||||
// self.process_define_ir(
|
|
||||||
// &function_ir,
|
|
||||||
// &mut nested_func_components,
|
|
||||||
// &mut nested_func_index_map,
|
|
||||||
// );
|
|
||||||
|
|
||||||
// for dependency in dependencies {
|
|
||||||
// println!("GOT HERE333");
|
|
||||||
// let dependency_scope = nested_func_index_map.get(&dependency).unwrap();
|
|
||||||
// if get_common_ancestor(scope, dependency_scope) == scope.clone()
|
|
||||||
// && !self.defined_functions.contains_key(func)
|
|
||||||
// {
|
|
||||||
// let components = nested_func_components.get(&dependency).unwrap();
|
|
||||||
|
|
||||||
// println!("COMPONENTS IS {:#?}", components);
|
|
||||||
// let mut dependency_ir = components.ir.clone();
|
|
||||||
|
|
||||||
// self.define_ir(
|
|
||||||
// &mut dependency_ir,
|
|
||||||
// &mut nested_func_components,
|
|
||||||
// &mut nested_func_index_map,
|
|
||||||
// );
|
|
||||||
|
|
||||||
// sorted_functions.append(&mut dependency_ir);
|
|
||||||
// self.defined_functions.insert(dependency, ());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// sorted_functions.push(IR::DefineFunc {
|
|
||||||
// scope: scope.clone(),
|
|
||||||
// func_name: func.function_name.clone(),
|
|
||||||
// module_name: func.module_name.clone(),
|
|
||||||
// params: function_components.args.clone(),
|
|
||||||
// recursive: function_components.recursive,
|
|
||||||
// });
|
|
||||||
|
|
||||||
// sorted_functions.extend(function_ir.clone());
|
|
||||||
|
|
||||||
// dependencies_included_ir.insert(func.clone(), sorted_functions);
|
|
||||||
|
|
||||||
// for item in nested_func_components {
|
|
||||||
// if !final_func_components.contains_key(&item.0) {
|
|
||||||
// final_func_components.insert(item.0, item.1);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// for item in nested_func_index_map {
|
|
||||||
// if let Some(scope) = final_func_index_map.get_mut(&item.0) {
|
|
||||||
// *scope = get_common_ancestor(scope, &item.1);
|
|
||||||
// } else {
|
|
||||||
// final_func_index_map.insert(item.0, item.1);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// for (index, ir) in ir_stack.clone().iter().enumerate().rev() {
|
|
||||||
// match ir {
|
|
||||||
// IR::Var { constructor, .. } => {
|
|
||||||
// if let ValueConstructorVariant::ModuleFn { .. } = &constructor.variant {}
|
|
||||||
// }
|
|
||||||
// a => {
|
|
||||||
// let scope = a.scope();
|
|
||||||
|
|
||||||
// for func in final_func_index_map.iter() {
|
|
||||||
// if get_common_ancestor(&scope, func.1) == scope
|
|
||||||
// && !self.defined_functions.contains_key(func.0)
|
|
||||||
// {
|
|
||||||
// let func_component = final_func_components.get(func.0).unwrap();
|
|
||||||
|
|
||||||
// for item in func_component.ir.iter().rev() {
|
|
||||||
// ir_stack.insert(index, item.clone())
|
|
||||||
// }
|
|
||||||
// self.defined_functions.insert(func.0.clone(), ());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process_define_ir(
|
fn process_define_ir(
|
||||||
|
|
|
@ -32,10 +32,9 @@ pub fn final_check(z: Int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn incrementor(counter: Int, target: Int) -> Int {
|
pub fn incrementor(counter: Int, target: Int) -> Int {
|
||||||
if counter == target {
|
when counter is {
|
||||||
target
|
target -> target
|
||||||
} else {
|
_ -> incrementor(counter+1, target)
|
||||||
incrementor(counter + 1, target)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,8 +50,8 @@ pub type Datum {
|
||||||
|
|
||||||
pub fn spend(datum: Datum, _rdmr: Nil, _ctx: Nil) -> Bool {
|
pub fn spend(datum: Datum, _rdmr: Nil, _ctx: Nil) -> Bool {
|
||||||
when datum is {
|
when datum is {
|
||||||
Offer { price, thing: t, .. } -> add_two(price) > 0
|
Offer { price, thing: t, .. } -> add_one(price) > 0
|
||||||
Hold(less) -> less < 0
|
Hold(less) -> incrementor(0, 8) == less
|
||||||
Sell -> add_one(1) > 1
|
Sell -> add_two(1) > 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue