feat(codegen): support multi-validators
* rename force_wrap to force * add a bunch of builder methods to Term<Name> * refactor one tiny location to show off builder methods * split generate into `generate` and `generate_test` * create wrap_as_multi_validator function Co-authored-by: Kasey White <kwhitemsg@gmail.com>
This commit is contained in:
@@ -4,7 +4,10 @@ use indexmap::{IndexMap, IndexSet};
|
||||
use itertools::Itertools;
|
||||
use uplc::{
|
||||
ast::{
|
||||
builder::{apply_wrap, delayed_choose_list, delayed_if_else, if_else},
|
||||
builder::{
|
||||
apply_wrap, constr_index_exposer, delayed_choose_list, delayed_if_else, if_else,
|
||||
CONSTR_FIELDS_EXPOSER,
|
||||
},
|
||||
Constant as UplcConstant, Name, Term, Type as UplcType,
|
||||
},
|
||||
builtins::DefaultFunction,
|
||||
@@ -193,10 +196,7 @@ pub fn convert_type_to_data(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
|
||||
apply_wrap(DefaultFunction::IData.into(), term)
|
||||
} else if field_type.is_void() {
|
||||
apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::ChooseUnit).force_wrap(),
|
||||
term,
|
||||
),
|
||||
apply_wrap(Term::Builtin(DefaultFunction::ChooseUnit).force(), term),
|
||||
Term::Constant(
|
||||
UplcConstant::Data(PlutusData::Constr(Constr {
|
||||
tag: convert_constr_to_tag(0).unwrap(),
|
||||
@@ -225,11 +225,9 @@ pub fn convert_type_to_data(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
|
||||
DefaultFunction::ListData.into(),
|
||||
apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::MkCons).force(),
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::FstPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
Term::Builtin(DefaultFunction::FstPair).force().force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: "__pair".to_string(),
|
||||
@@ -241,11 +239,9 @@ pub fn convert_type_to_data(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
|
||||
),
|
||||
apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::MkCons).force(),
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::SndPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
Term::Builtin(DefaultFunction::SndPair).force().force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: "__pair".to_string(),
|
||||
@@ -303,9 +299,7 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
|
||||
Term::Constant(UplcConstant::Integer(0.into()).into()),
|
||||
),
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::FstPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
Term::Builtin(DefaultFunction::FstPair).force().force(),
|
||||
apply_wrap(DefaultFunction::UnConstrData.into(), term),
|
||||
),
|
||||
),
|
||||
@@ -338,7 +332,7 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkPairData),
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::HeadList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: "__list_data".to_string(),
|
||||
@@ -349,7 +343,7 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
|
||||
),
|
||||
),
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::HeadList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: "__tail".to_string(),
|
||||
@@ -362,7 +356,7 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
|
||||
.into(),
|
||||
},
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: "__list_data".to_string(),
|
||||
@@ -385,9 +379,7 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
|
||||
Term::Constant(UplcConstant::Integer(1.into()).into()),
|
||||
),
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::FstPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
Term::Builtin(DefaultFunction::FstPair).force().force(),
|
||||
apply_wrap(DefaultFunction::UnConstrData.into(), term),
|
||||
),
|
||||
)
|
||||
@@ -576,7 +568,7 @@ pub fn list_access_to_uplc(
|
||||
&& is_list_accessor
|
||||
{
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::HeadList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!("tail_index_{}_{}", current_index, id_list[current_index]),
|
||||
@@ -588,7 +580,7 @@ pub fn list_access_to_uplc(
|
||||
} else {
|
||||
convert_data_to_type(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::HeadList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!(
|
||||
@@ -631,7 +623,7 @@ pub fn list_access_to_uplc(
|
||||
body: term.into(),
|
||||
},
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!(
|
||||
@@ -690,7 +682,7 @@ pub fn list_access_to_uplc(
|
||||
body: term.into(),
|
||||
},
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!(
|
||||
@@ -725,7 +717,7 @@ pub fn list_access_to_uplc(
|
||||
body: if check_last_item {
|
||||
delayed_choose_list(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!(
|
||||
@@ -740,7 +732,7 @@ pub fn list_access_to_uplc(
|
||||
term,
|
||||
apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::Trace).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::Trace).force(),
|
||||
Term::Constant(
|
||||
UplcConstant::String(
|
||||
"List/Tuple/Constr contains more items than expected"
|
||||
@@ -751,7 +743,7 @@ pub fn list_access_to_uplc(
|
||||
),
|
||||
Term::Delay(Term::Error.into()),
|
||||
)
|
||||
.force_wrap(),
|
||||
.force(),
|
||||
)
|
||||
.into()
|
||||
} else {
|
||||
@@ -775,7 +767,7 @@ pub fn list_access_to_uplc(
|
||||
body: if check_last_item {
|
||||
delayed_choose_list(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!(
|
||||
@@ -790,7 +782,7 @@ pub fn list_access_to_uplc(
|
||||
term,
|
||||
apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::Trace).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::Trace).force(),
|
||||
Term::Constant(
|
||||
UplcConstant::String(
|
||||
"List/Tuple/Constr contains more items than it expected"
|
||||
@@ -801,7 +793,7 @@ pub fn list_access_to_uplc(
|
||||
),
|
||||
Term::Delay(Term::Error.into()),
|
||||
)
|
||||
.force_wrap(),
|
||||
.force(),
|
||||
)
|
||||
.into()
|
||||
} else {
|
||||
@@ -845,7 +837,7 @@ pub fn list_access_to_uplc(
|
||||
body: apply_wrap(
|
||||
list_access_inner,
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!(
|
||||
@@ -936,7 +928,7 @@ pub fn list_access_to_uplc(
|
||||
body: apply_wrap(
|
||||
list_access_inner,
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!(
|
||||
@@ -1358,6 +1350,22 @@ pub fn wrap_validator_args(term: Term<Name>, arguments: &[TypedArg]) -> Term<Nam
|
||||
term
|
||||
}
|
||||
|
||||
pub fn wrap_as_multi_validator(spend: Term<Name>, mint: Term<Name>) -> Term<Name> {
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(constr_index_exposer(Term::var("__second_arg")))
|
||||
.delayed_if_else(
|
||||
mint.apply(Term::var("__first_arg"))
|
||||
.apply(Term::var("__second_arg")),
|
||||
spend.apply(Term::var("__first_arg")).apply(
|
||||
Term::head_list()
|
||||
.apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("__second_arg"))),
|
||||
),
|
||||
)
|
||||
.lambda("__second_arg")
|
||||
.lambda("__first_arg")
|
||||
}
|
||||
|
||||
pub fn monomorphize(
|
||||
ir: Vec<Air>,
|
||||
mono_types: IndexMap<u64, Arc<Type>>,
|
||||
|
||||
@@ -21,15 +21,15 @@ use crate::{
|
||||
air::Air,
|
||||
ast::{
|
||||
ArgName, AssignmentKind, BinOp, Pattern, Span, TypedArg, TypedClause, TypedDataType,
|
||||
TypedFunction, UnOp,
|
||||
TypedFunction, TypedValidator, UnOp,
|
||||
},
|
||||
builder::{
|
||||
check_replaceable_opaque_type, check_when_pattern_needs, constants_ir,
|
||||
convert_constants_to_data, convert_data_to_type, convert_type_to_data, get_common_ancestor,
|
||||
get_generic_id_and_type, handle_clause_guard, handle_func_dependencies_ir,
|
||||
handle_recursion_ir, list_access_to_uplc, lookup_data_type_by_tipo, monomorphize,
|
||||
rearrange_clauses, replace_opaque_type, wrap_validator_args, AssignmentProperties,
|
||||
ClauseProperties, DataTypeKey, FuncComponents, FunctionAccessKey,
|
||||
rearrange_clauses, replace_opaque_type, wrap_as_multi_validator, wrap_validator_args,
|
||||
AssignmentProperties, ClauseProperties, DataTypeKey, FuncComponents, FunctionAccessKey,
|
||||
},
|
||||
builtins::bool,
|
||||
expr::TypedExpr,
|
||||
@@ -80,14 +80,17 @@ impl<'a> CodeGenerator<'a> {
|
||||
|
||||
pub fn generate(
|
||||
&mut self,
|
||||
body: &TypedExpr,
|
||||
arguments: &[TypedArg],
|
||||
wrap_as_validator: bool,
|
||||
TypedValidator {
|
||||
fun,
|
||||
other_fun,
|
||||
params,
|
||||
..
|
||||
}: &TypedValidator,
|
||||
) -> Program<Name> {
|
||||
let mut ir_stack = vec![];
|
||||
let scope = vec![self.id_gen.next()];
|
||||
|
||||
self.build_ir(body, &mut ir_stack, scope);
|
||||
self.build_ir(&fun.body, &mut ir_stack, scope);
|
||||
|
||||
self.define_ir(&mut ir_stack);
|
||||
|
||||
@@ -102,15 +105,75 @@ impl<'a> CodeGenerator<'a> {
|
||||
}
|
||||
|
||||
// Wrap the validator body if ifThenElse term unit error
|
||||
term = if wrap_as_validator {
|
||||
final_wrapper(term)
|
||||
} else {
|
||||
term
|
||||
};
|
||||
term = final_wrapper(term);
|
||||
|
||||
term = wrap_validator_args(term, &fun.arguments);
|
||||
|
||||
if let Some(other) = other_fun {
|
||||
self.reset();
|
||||
|
||||
let mut other_ir_stack = vec![];
|
||||
|
||||
let scope = vec![self.id_gen.next()];
|
||||
|
||||
self.build_ir(&other.body, &mut other_ir_stack, scope);
|
||||
|
||||
self.define_ir(&mut other_ir_stack);
|
||||
|
||||
self.convert_opaque_type_to_inner_ir(&mut other_ir_stack);
|
||||
|
||||
let other_term = self.uplc_code_gen(&mut other_ir_stack);
|
||||
|
||||
let other_term = final_wrapper(other_term);
|
||||
|
||||
let other_term = wrap_validator_args(other_term, &other.arguments);
|
||||
|
||||
let (spend, mint) = if other.arguments.len() > fun.arguments.len() {
|
||||
(other_term, term)
|
||||
} else {
|
||||
(term, other_term)
|
||||
};
|
||||
|
||||
term = wrap_as_multi_validator(spend, mint);
|
||||
term = builder::constr_get_field(term);
|
||||
|
||||
term = builder::constr_fields_exposer(term);
|
||||
}
|
||||
|
||||
term = wrap_validator_args(term, params);
|
||||
|
||||
self.finalize(term, true)
|
||||
}
|
||||
|
||||
pub fn generate_test(
|
||||
&mut self,
|
||||
test_body: &TypedExpr,
|
||||
arguments: &[TypedArg],
|
||||
) -> Program<Name> {
|
||||
let mut ir_stack = vec![];
|
||||
let scope = vec![self.id_gen.next()];
|
||||
|
||||
self.build_ir(test_body, &mut ir_stack, scope);
|
||||
|
||||
self.define_ir(&mut ir_stack);
|
||||
|
||||
self.convert_opaque_type_to_inner_ir(&mut ir_stack);
|
||||
|
||||
let mut term = self.uplc_code_gen(&mut ir_stack);
|
||||
|
||||
if self.needs_field_access {
|
||||
term = builder::constr_get_field(term);
|
||||
|
||||
term = builder::constr_fields_exposer(term);
|
||||
}
|
||||
|
||||
term = wrap_validator_args(term, arguments);
|
||||
|
||||
term = if wrap_as_validator || self.used_data_assert_on_list {
|
||||
self.finalize(term, false)
|
||||
}
|
||||
|
||||
fn finalize(&mut self, term: Term<Name>, wrap_as_validator: bool) -> Program<Name> {
|
||||
let term = if wrap_as_validator || self.used_data_assert_on_list {
|
||||
assert_on_list(term)
|
||||
} else {
|
||||
term
|
||||
@@ -4029,16 +4092,9 @@ impl<'a> CodeGenerator<'a> {
|
||||
UplcConstant::ProtoList(UplcType::Data, vec![]).into(),
|
||||
);
|
||||
|
||||
let term = apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::ConstrData),
|
||||
Term::Constant(
|
||||
UplcConstant::Integer(constr_index.try_into().unwrap())
|
||||
.into(),
|
||||
),
|
||||
),
|
||||
fields,
|
||||
);
|
||||
let term = Term::constr_data()
|
||||
.apply(Term::integer(constr_index.try_into().unwrap()))
|
||||
.apply(fields);
|
||||
|
||||
arg_stack.push(term);
|
||||
}
|
||||
@@ -4134,10 +4190,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
convert_type_to_data(arg, &list_type)
|
||||
};
|
||||
term = apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
list_item,
|
||||
),
|
||||
apply_wrap(Term::Builtin(DefaultFunction::MkCons).force(), list_item),
|
||||
term,
|
||||
);
|
||||
}
|
||||
@@ -4204,7 +4257,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
body: term.into(),
|
||||
},
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: tail_var,
|
||||
@@ -4231,7 +4284,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
} else {
|
||||
convert_data_to_type(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::HeadList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: tail_var,
|
||||
@@ -4340,7 +4393,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
} => {
|
||||
let mut term: Term<Name> = Term::Builtin(func);
|
||||
for _ in 0..func.force_count() {
|
||||
term = term.force_wrap();
|
||||
term = term.force();
|
||||
}
|
||||
|
||||
let mut arg_vec = vec![];
|
||||
@@ -4421,8 +4474,8 @@ impl<'a> CodeGenerator<'a> {
|
||||
Term::Builtin(DefaultFunction::IData),
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::FstPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
.force()
|
||||
.force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: temp_tuple.clone(),
|
||||
@@ -4436,9 +4489,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::ListData),
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::SndPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
Term::Builtin(DefaultFunction::SndPair).force().force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: temp_tuple,
|
||||
@@ -4504,7 +4555,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
term = term.force_wrap();
|
||||
term = term.force();
|
||||
|
||||
if count == 0 {
|
||||
for temp_var in temp_vars.into_iter().rev() {
|
||||
@@ -4583,7 +4634,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
DefaultFunction::MapData.into(),
|
||||
apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::MkCons).force(),
|
||||
left,
|
||||
),
|
||||
Term::Constant(
|
||||
@@ -4603,7 +4654,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
DefaultFunction::MapData.into(),
|
||||
apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::MkCons).force(),
|
||||
right,
|
||||
),
|
||||
Term::Constant(
|
||||
@@ -4678,7 +4729,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
DefaultFunction::MapData.into(),
|
||||
apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::MkCons).force(),
|
||||
left,
|
||||
),
|
||||
Term::Constant(
|
||||
@@ -4698,7 +4749,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
DefaultFunction::MapData.into(),
|
||||
apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::MkCons).force(),
|
||||
right,
|
||||
),
|
||||
Term::Constant(
|
||||
@@ -4919,7 +4970,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
|
||||
let error_term = apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::Trace).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::Trace).force(),
|
||||
Term::Constant(
|
||||
UplcConstant::String(
|
||||
"Expected on incorrect constructor variant.".to_string(),
|
||||
@@ -4929,7 +4980,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
),
|
||||
Term::Delay(Term::Error.into()),
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
|
||||
term = delayed_if_else(
|
||||
apply_wrap(
|
||||
@@ -4951,7 +5002,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
|
||||
let error_term = apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::Trace).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::Trace).force(),
|
||||
Term::Constant(
|
||||
UplcConstant::String(
|
||||
"Expected on incorrect boolean variant.".to_string(),
|
||||
@@ -4961,7 +5012,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
),
|
||||
Term::Delay(Term::Error.into()),
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
|
||||
if is_true {
|
||||
term = delayed_if_else(value, term, error_term);
|
||||
@@ -5048,7 +5099,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
.into(),
|
||||
),
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
} else {
|
||||
term = if_else(
|
||||
Term::Var(
|
||||
@@ -5067,7 +5118,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
),
|
||||
Term::Delay(body.into()),
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
}
|
||||
|
||||
term = apply_wrap(
|
||||
@@ -5175,7 +5226,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
.into(),
|
||||
),
|
||||
)
|
||||
.force_wrap()
|
||||
.force()
|
||||
.into(),
|
||||
},
|
||||
Term::Delay(term.into()),
|
||||
@@ -5210,7 +5261,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
body: term.into(),
|
||||
},
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: tail_name.clone(),
|
||||
@@ -5242,7 +5293,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
.into(),
|
||||
),
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
|
||||
term = apply_wrap(
|
||||
Term::Lambda {
|
||||
@@ -5318,7 +5369,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
Term::Delay(then.into()),
|
||||
term,
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
} else {
|
||||
term = if_else(
|
||||
Term::Var(
|
||||
@@ -5331,7 +5382,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
term,
|
||||
Term::Delay(then.into()),
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
}
|
||||
arg_stack.push(term);
|
||||
} else {
|
||||
@@ -5394,7 +5445,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
.into(),
|
||||
),
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
arg_stack.push(term);
|
||||
}
|
||||
}
|
||||
@@ -5422,7 +5473,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
body: term.into(),
|
||||
},
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: tail_name.clone(),
|
||||
@@ -5454,7 +5505,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
.into(),
|
||||
),
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
} else {
|
||||
term = choose_list(
|
||||
Term::Var(
|
||||
@@ -5473,7 +5524,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
),
|
||||
Term::Delay(term.into()),
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
}
|
||||
|
||||
arg_stack.push(term);
|
||||
@@ -5507,7 +5558,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
for (index, arg) in arg_vec.iter().enumerate().rev() {
|
||||
term = apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::MkCons).force(),
|
||||
convert_type_to_data(arg.clone(), &tipo.arg_types().unwrap()[index]),
|
||||
),
|
||||
term,
|
||||
@@ -5677,7 +5728,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
for (arg, tipo) in args.into_iter().zip(tuple_sub_types.into_iter()).rev() {
|
||||
term = apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::MkCons).force(),
|
||||
convert_type_to_data(arg, &tipo),
|
||||
),
|
||||
term,
|
||||
@@ -5715,7 +5766,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
unchanged_field_indices.reverse();
|
||||
|
||||
let mut term = apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!("{tail_name_prefix}_{highest_index}"),
|
||||
@@ -5731,7 +5782,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
if let Some((tipo, arg)) = args.get(¤t_index) {
|
||||
term = apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::MkCons).force(),
|
||||
convert_type_to_data(arg.clone(), tipo),
|
||||
),
|
||||
term,
|
||||
@@ -5739,9 +5790,9 @@ impl<'a> CodeGenerator<'a> {
|
||||
} else {
|
||||
term = apply_wrap(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::MkCons).force(),
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::HeadList).force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: tail_name,
|
||||
@@ -5781,7 +5832,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
if index < prev_index {
|
||||
for _ in index..prev_index {
|
||||
tail_list = apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::TailList).force(),
|
||||
tail_list,
|
||||
);
|
||||
}
|
||||
@@ -5813,10 +5864,8 @@ impl<'a> CodeGenerator<'a> {
|
||||
);
|
||||
|
||||
for _ in 0..prev_index {
|
||||
tail_list = apply_wrap(
|
||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||
tail_list,
|
||||
);
|
||||
tail_list =
|
||||
apply_wrap(Term::Builtin(DefaultFunction::TailList).force(), tail_list);
|
||||
}
|
||||
if prev_index != 0 {
|
||||
term = apply_wrap(
|
||||
@@ -5884,9 +5933,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
if tuple_index == 0 {
|
||||
term = convert_data_to_type(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::FstPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
Term::Builtin(DefaultFunction::FstPair).force().force(),
|
||||
term,
|
||||
),
|
||||
&tipo.get_inner_types()[0],
|
||||
@@ -5894,9 +5941,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
} else {
|
||||
term = convert_data_to_type(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::SndPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
Term::Builtin(DefaultFunction::SndPair).force().force(),
|
||||
term,
|
||||
),
|
||||
&tipo.get_inner_types()[1],
|
||||
@@ -5962,8 +6007,8 @@ impl<'a> CodeGenerator<'a> {
|
||||
convert_data_to_type(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::SndPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
.force()
|
||||
.force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!("__tuple_{list_id}"),
|
||||
@@ -5979,9 +6024,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
},
|
||||
convert_data_to_type(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::FstPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
Term::Builtin(DefaultFunction::FstPair).force().force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: format!("__tuple_{list_id}"),
|
||||
@@ -6028,10 +6071,10 @@ impl<'a> CodeGenerator<'a> {
|
||||
let term = arg_stack.pop().unwrap();
|
||||
|
||||
let term = apply_wrap(
|
||||
apply_wrap(Term::Builtin(DefaultFunction::Trace).force_wrap(), text),
|
||||
apply_wrap(Term::Builtin(DefaultFunction::Trace).force(), text),
|
||||
Term::Delay(term.into()),
|
||||
)
|
||||
.force_wrap();
|
||||
.force();
|
||||
|
||||
arg_stack.push(term);
|
||||
}
|
||||
@@ -6077,9 +6120,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
},
|
||||
convert_data_to_type(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::FstPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
Term::Builtin(DefaultFunction::FstPair).force().force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: subject_name.clone(),
|
||||
@@ -6103,9 +6144,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
},
|
||||
convert_data_to_type(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::SndPair)
|
||||
.force_wrap()
|
||||
.force_wrap(),
|
||||
Term::Builtin(DefaultFunction::SndPair).force().force(),
|
||||
Term::Var(
|
||||
Name {
|
||||
text: subject_name.clone(),
|
||||
@@ -6132,7 +6171,7 @@ impl<'a> CodeGenerator<'a> {
|
||||
},
|
||||
convert_data_to_type(
|
||||
apply_wrap(
|
||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
||||
Term::Builtin(DefaultFunction::HeadList).force(),
|
||||
repeat_tail_list(
|
||||
Term::Var(
|
||||
Name {
|
||||
|
||||
Reference in New Issue
Block a user