Fix out of order expect check. Also fix no_inline error in code gen. @acceptance_107

This commit is contained in:
microproofs 2024-07-31 10:00:45 -04:00 committed by Kasey
parent 663695558c
commit 05504b9762
3 changed files with 62 additions and 61 deletions

View File

@ -640,8 +640,6 @@ impl<'a> CodeGenerator<'a> {
match &branch.is { match &branch.is {
Some((pattern, tipo)) => { Some((pattern, tipo)) => {
println!("PATTERN TYPE: {:#?}", pattern);
println!("Branch TYPE: {:#?}", tipo);
AirTree::let_assignment( AirTree::let_assignment(
"acc_var", "acc_var",
// use anon function as a delay to avoid evaluating the acc // use anon function as a delay to avoid evaluating the acc
@ -4555,7 +4553,7 @@ impl<'a> CodeGenerator<'a> {
// How we handle zero arg anon functions has changed // How we handle zero arg anon functions has changed
// We now delay zero arg anon functions and force them on a call operation // We now delay zero arg anon functions and force them on a call operation
match &term { match term.pierce_no_inlines() {
Term::Var(name) => { Term::Var(name) => {
let zero_arg_functions = self.zero_arg_functions.clone(); let zero_arg_functions = self.zero_arg_functions.clone();
let text = &name.text; let text = &name.text;
@ -4935,7 +4933,7 @@ impl<'a> CodeGenerator<'a> {
Air::CastToData { tipo } => { Air::CastToData { tipo } => {
let mut term = arg_stack.pop().unwrap(); let mut term = arg_stack.pop().unwrap();
if extract_constant(&term).is_some() { if extract_constant(term.pierce_no_inlines()).is_some() {
term = builder::convert_type_to_data(term, &tipo); term = builder::convert_type_to_data(term, &tipo);
let mut program: Program<Name> = Program { let mut program: Program<Name> = Program {
@ -5384,7 +5382,7 @@ impl<'a> CodeGenerator<'a> {
.apply(term); .apply(term);
if arg_vec.iter().all(|item| { if arg_vec.iter().all(|item| {
let maybe_const = extract_constant(item); let maybe_const = extract_constant(item.pierce_no_inlines());
maybe_const.is_some() maybe_const.is_some()
}) { }) {
let mut program: Program<Name> = Program { let mut program: Program<Name> = Program {

View File

@ -1457,22 +1457,22 @@ pub fn list_access_to_uplc(
.lambda(tail_name) .lambda(tail_name)
} else { } else {
// Custom error if list is not empty after this head // Custom error if list is not empty after this head
head_item( Term::var(tail_name.to_string())
name, .choose_list(
tipo, otherwise_delayed.clone(),
&tail_name, head_item(
Term::var(tail_name.to_string()) name,
.choose_list( tipo,
otherwise_delayed.clone(), &tail_name,
Term::tail_list() Term::tail_list()
.apply(Term::var(tail_name.to_string())) .apply(Term::var(tail_name.to_string()))
.choose_list(acc.delay(), otherwise_delayed.clone()) .choose_list(acc.delay(), otherwise_delayed.clone())
.force(), .force(),
) )
.delay(), .delay(),
) )
.force() .force()
.lambda(tail_name) .lambda(tail_name)
} }
} }
} }

View File

@ -5233,63 +5233,66 @@ fn expect_head_cast_data_no_tail() {
assert_uplc( assert_uplc(
src, src,
Term::var("tail_0") Term::data(Data::list(vec![
Data::integer(1.into()),
Data::integer(2.into()),
Data::integer(3.into()),
]))
.choose_data(
Term::var("expect[h]:List<Int>=a"),
Term::var("expect[h]:List<Int>=a"),
Term::list_values(vec![
Constant::Data(Data::integer(1.into())),
Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())),
])
.choose_list( .choose_list(
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
Term::tail_list() Term::var("__var")
.apply(Term::var("tail_0")) .choose_data(
.choose_list( Term::var("expect[h]:List<Int>=a"),
Term::equals_integer() Term::var("expect[h]:List<Int>=a"),
.apply(Term::var("h")) Term::var("expect[h]:List<Int>=a"),
.apply(Term::var("h")) Term::tail_list()
.apply(Term::list_values(vec![
Constant::Data(Data::integer(1.into())),
Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())),
]))
.choose_list(
Term::equals_integer()
.apply(Term::var("h"))
.apply(Term::var("h"))
.delay(),
Term::var("expect[h]:List<Int>=a"),
)
.force()
.lambda("h")
.apply(Term::un_i_data().apply(Term::var("__var")))
.delay(), .delay(),
Term::var("expect[h]:List<Int>=a"), Term::var("expect[h]:List<Int>=a"),
) )
.force() .force()
.lambda("h") .lambda("__var")
.apply( .apply(Term::head_list().apply(Term::list_values(vec![
Term::var("__var")
.choose_data(
Term::var("expect[h]:List<Int>=a"),
Term::var("expect[h]:List<Int>=a"),
Term::var("expect[h]:List<Int>=a"),
Term::un_i_data().apply(Term::var("__var")).delay(),
Term::var("expect[h]:List<Int>=a"),
)
.force()
.lambda("__var")
.apply(Term::head_list().apply(Term::var("tail_0"))),
)
.delay(),
)
.force()
.lambda("tail_0")
.apply(
Term::data(Data::list(vec![
Data::integer(1.into()),
Data::integer(2.into()),
Data::integer(3.into()),
]))
.choose_data(
Term::var("expect[h]:List<Int>=a"),
Term::var("expect[h]:List<Int>=a"),
Term::list_values(vec![
Constant::Data(Data::integer(1.into())), Constant::Data(Data::integer(1.into())),
Constant::Data(Data::integer(2.into())), Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())), Constant::Data(Data::integer(3.into())),
]) ])))
.delay(), .delay(),
Term::var("expect[h]:List<Int>=a"),
Term::var("expect[h]:List<Int>=a"),
)
.force(),
) )
.lambda("expect[h]:List<Int>=a") .force()
.apply( .delay(),
Term::Error Term::var("expect[h]:List<Int>=a"),
.delayed_trace(Term::string("expect [h]: List<Int> = a")) Term::var("expect[h]:List<Int>=a"),
.delay(), )
), .force()
.lambda("expect[h]:List<Int>=a")
.apply(
Term::Error
.delayed_trace(Term::string("expect [h]: List<Int> = a"))
.delay(),
),
true, true,
); );
} }