From 90c775320129317f16509b6791941fb693597221 Mon Sep 17 00:00:00 2001 From: microproofs Date: Mon, 7 Aug 2023 18:17:53 -0400 Subject: [PATCH] update tests for new recursion optmization --- crates/aiken-lang/src/gen_uplc.rs | 8 +- .../aiken-project/src/blueprint/validator.rs | 16 +- crates/aiken-project/src/tests/gen_uplc.rs | 606 ++++++++++-------- 3 files changed, 333 insertions(+), 297 deletions(-) diff --git a/crates/aiken-lang/src/gen_uplc.rs b/crates/aiken-lang/src/gen_uplc.rs index 5376ce16..7c2fed98 100644 --- a/crates/aiken-lang/src/gen_uplc.rs +++ b/crates/aiken-lang/src/gen_uplc.rs @@ -2835,8 +2835,6 @@ impl<'a> CodeGenerator<'a> { } else { dependent_params.clone() }; - - dep_insertions.push(AirTree::define_func( &dep_key.function_name, @@ -3747,13 +3745,15 @@ impl<'a> CodeGenerator<'a> { // If we have parameters that remain static in each recursive call, // we can construct an *outer* function to take those in // and simplify the recursive part to only accept the non-static arguments - let mut recursive_func_body = Term::var(&func_name).apply(Term::var(&func_name)); + let mut recursive_func_body = + Term::var(&func_name).apply(Term::var(&func_name)); for param in recursive_nonstatic_params.iter() { recursive_func_body = recursive_func_body.apply(Term::var(param)); } // Then construct an outer function with *all* parameters, not just the nonstatic ones. - let mut outer_func_body = recursive_func_body.lambda(&func_name).apply(func_body); + let mut outer_func_body = + recursive_func_body.lambda(&func_name).apply(func_body); // Now, add *all* parameters, so that other call sites don't know the difference for param in params.iter().rev() { diff --git a/crates/aiken-project/src/blueprint/validator.rs b/crates/aiken-project/src/blueprint/validator.rs index f213e86c..3804b2c6 100644 --- a/crates/aiken-project/src/blueprint/validator.rs +++ b/crates/aiken-project/src/blueprint/validator.rs @@ -418,8 +418,8 @@ mod tests { "$ref": "#/definitions/test_module~1Input" } }, - "compiledCode": "59029a01000032323232323232323232322223232533300a4a22930b19299980519b874800000454ccc038c020010526153300b4911d4578706563746564206e6f206669656c647320666f7220436f6e73747200161533300a3370e90010008a99980718040020a4c2a6601692011d4578706563746564206e6f206669656c647320666f7220436f6e73747200161533300a3370e90020008a99980718040020a4c2a6601692011d4578706563746564206e6f206669656c647320666f7220436f6e7374720016153300b4912b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300800333232232533300c3370e90000008991919191919299980b180c0010991924c6601400846eb8004c94ccc04ccdc3a400000226464a66603260360042930a9980b249334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375a6032002602200c2a660289212b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016301100515330134901334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375c602c002602c0046eb0c050004c050008c048004c02800854cc0352412b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300a0013001001222533300f00214984c8ccc010010c04800c008c004c04000800ccc0040052000222233330073370e0020060184666600a00a66e000112002300e001002002230063754002460086ea80055cd2b9c5573aaae7955cfaba157441", - "hash": "0d35a0ec18c7a4bcf0e14d2b21ddc6798b07aaee55ee7af46fe35448", + "compiledCode": "59029101000032323232323232323232322223232533300a4a22930b19299980519b874800000454ccc038c020010526153300b4911d4578706563746564206e6f206669656c647320666f7220436f6e73747200161533300a3370e90010008a99980718040020a4c2a6601692011d4578706563746564206e6f206669656c647320666f7220436f6e73747200161533300a3370e90020008a99980718040020a4c2a6601692011d4578706563746564206e6f206669656c647320666f7220436f6e7374720016153300b4912b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e74001630080033253330093370e900000089919191919192999809980a8010991924c646600200200a44a66602c00229309919801801980c801191bae00130170013253330103370e900000089919299980b180c0010a4c2a660269201334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375a602c002601c00c2a660229212b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300e00515330104901334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375c602600260260046eb0c044004c044008c03c004c01c01054cc0292412b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300700333001001480008888cccc01ccdc38008018061199980280299b8000448008c0380040080088c018dd5000918021baa0015734ae7155ceaab9e5573eae855d11", + "hash": "401a6c4bac4f3554a9bbe260aa12d2eec8c97bf903d23cd6ad426d1e", "definitions": { "ByteArray": { "dataType": "bytes" @@ -683,8 +683,8 @@ mod tests { "$ref": "#/definitions/test_module~1Dict$test_module~1UUID_Int" } }, - "compiledCode": "590110010000323232323232323232223253330064a22930b19919119299980499b87480000044c8c94ccc03cc0440084c92633005001232375a60200046eb8c03800454cc031241334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e20657870656374656400163756601e00260186ea800854cc0292412b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300a37540026002002444a66601800429309919980200218078018011800980680100119800800a40004444666600a66e1c00400c0288cccc014014cdc0002240046018002004004ae695ce2ab9d5573caae7d5d0aba21", - "hash": "90090f9697c714ade0e0e9969aba9db6702f751628cdd5843d0274b6", + "compiledCode": "590106010000323232323232323232223253330064a22930b19299980319b87480000044c8c94ccc030c0380084c926323300100100222533300e00114984c8cc00c00cc044008c8c8dd698078011bae300d001300f0011533009491334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e20657870656374656400163756601800260126ea800c54cc01d2412b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300737540046600200290001111199980299b8700100300a2333300500533700008900118060008010012b9a5738aae7555cf2ab9f5742ae89", + "hash": "683885e262c8857f80788a1626c1a327267d85cb49e08382288933b2", "definitions": { "ByteArray": { "dataType": "bytes" @@ -746,8 +746,8 @@ mod tests { "$ref": "#/definitions/test_module~1Dict$test_module~1UUID_Int" } }, - "compiledCode": "585001000032323232323222323253330054a22930b1999180080091129998050010a4c264666008008601a006004600260160040024646eb4c020008dd718030009bab0025734aae7555cf2ab9f5742ae89", - "hash": "09cac9988ed491803b5ae5e6c00783cdab5d95ad9cf8882856647a39", + "compiledCode": "584c01000032323232323222323253330054a22930b19198008008011129998048008a4c26466006006601800464646eb4c028008dd7180400098050009bab0025734aae7555cf2ab9f5742ae881", + "hash": "6ab85c61be6a417c860621155f9c9c91cbaff382efbe7d532173b7ea", "definitions": { "ByteArray": { "dataType": "bytes" @@ -944,8 +944,8 @@ mod tests { "$ref": "#/definitions/test_module~1LinkedList$Int" } }, - "compiledCode": "59035e010000323232323232323232323222232323232533300c4a22930b1801002999191919119299980819b87480000044c8c94ccc058c0600084c92630070011533013491334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e20657870656374656400163016001300e002153330103370e9001000899191919299980c180d00109924c6464660120024601c0026eb0c060008dd7180b0008a9980aa49334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e20657870656374656400163232337606034004603400260340026eb0c060004c060008dd6980b00098070010a99808a4812b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300e0013001001222533301300214984c8ccc010010c05800c008c004c050008c00400488c94ccc034cdc3a4000002264646464a66602a602e00426493198038038008a998092481334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016301500130150023370e900118081baa3013001300b0021533300d3370e90010008a99980898058010a4c2a6601c9211d4578706563746564206e6f206669656c647320666f7220436f6e7374720016153300e4912b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300b00100530010012232533300b3370e90000008991919192999809980a80109924c6600e00e0022a66020921334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e206578706563746564001630130013013002375a602200260120042a66601666e1d20020011533300f3009002149854cc03124011d4578706563746564206e6f206669656c647320666f7220436f6e7374720016153300c4912b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300900133001001480008888cccc01ccdc38008018061199980280299b8000448008c0380040080088c018dd5000918021baa0015734ae7155ceaab9e5573eae855d11", - "hash": "feae9dcb5bb1552028eba02fd2a5cd575c292cf1f3e4f1e8a19e4c48", + "compiledCode": "590358010000323232323232323232323222232323232533300c4a22930b180100299919119299980719b87480000044c8c94ccc050c0580084c92630050011533011491334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e20657870656374656400163014001300c0021533300e3370e9001000899191919299980b180c00109924c6464646600200200444a66603400229309919801801980e801191807000980d8009bac3016002375c60280022a660269201334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e20657870656374656400163232337606030004603000260300026eb0c058004c058008dd6980a00098060010a99807a4812b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300c00130010012232533300d3370e9000000899191919299980a980b80109924c6600e00e0022a660249201334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016301500130150023370e900118081baa3013001300b0021533300d3370e90010008a99980898058010a4c2a6601c9211d4578706563746564206e6f206669656c647320666f7220436f6e7374720016153300e4912b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300b00100530010012232533300b3370e90000008991919192999809980a80109924c6600e00e0022a66020921334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e206578706563746564001630130013013002375a602200260120042a66601666e1d20020011533300f3009002149854cc03124011d4578706563746564206e6f206669656c647320666f7220436f6e7374720016153300c4912b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300900133001001480008888cccc01ccdc38008018061199980280299b8000448008c0380040080088c018dd5000918021baa0015734ae7155ceaab9e5573eae855d11", + "hash": "2250642962915ebe2fc08ad9cd0377f2a4b8c281d94f8bae6782fd63", "definitions": { "Bool": { "title": "Bool", diff --git a/crates/aiken-project/src/tests/gen_uplc.rs b/crates/aiken-project/src/tests/gen_uplc.rs index 79ff47c6..c2075242 100644 --- a/crates/aiken-project/src/tests/gen_uplc.rs +++ b/crates/aiken-project/src/tests/gen_uplc.rs @@ -186,31 +186,35 @@ fn acceptance_test_2_repeat() { .apply( Term::list_data().apply( Term::var("repeat") - .lambda("repeat") - .apply(Term::var("repeat").apply(Term::var("repeat"))) .lambda("repeat") .apply( - Term::less_than_equals_integer() + Term::var("repeat") + .apply(Term::var("repeat")) .apply(Term::var("n")) - .apply(Term::integer(0.into())) - .delayed_if_else( - Term::empty_list(), - Term::mk_cons() - .apply(Term::b_data().apply(Term::var("x"))) - .apply( - Term::var("repeat") - .apply(Term::var("repeat")) - .apply(Term::var("x")) + .lambda("repeat") + .apply( + Term::less_than_equals_integer() + .apply(Term::var("n")) + .apply(Term::integer(0.into())) + .delayed_if_else( + Term::empty_list(), + Term::mk_cons() + .apply(Term::b_data().apply(Term::var("x"))) .apply( - Term::sub_integer() - .apply(Term::var("n")) - .apply(Term::integer(1.into())), + Term::var("repeat") + .apply(Term::var("repeat")) + .apply( + Term::sub_integer() + .apply(Term::var("n")) + .apply(Term::integer(1.into())), + ), ), - ), + ) + .lambda("n") + .lambda("repeat"), ) .lambda("n") - .lambda("x") - .lambda("repeat"), + .lambda("x"), ) .apply(Term::byte_string("aiken".as_bytes().to_vec())) .apply(Term::integer(2.into())), @@ -267,33 +271,35 @@ fn acceptance_test_3_concat() { .lambda("left"), ) .lambda("foldr") - .apply(Term::var("foldr").apply(Term::var("foldr"))) - .lambda("foldr") .apply( - Term::var("xs") - .delayed_choose_list( - Term::var("zero"), - Term::var("f") - .apply(Term::var("x")) - .apply( - Term::var("foldr") - .apply(Term::var("foldr")) - .apply(Term::var("rest")) - .apply(Term::var("f")) - .apply(Term::var("zero")), + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("xs")) + .lambda("foldr") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::var("zero"), + Term::var("f") + .apply(Term::var("x")) + .apply( + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("foldr"), ) .lambda("zero") .lambda("f") - .lambda("xs") - .lambda("foldr"), + .lambda("xs"), ) .apply(Term::list_values(vec![ Constant::Data(Data::integer(1.into())), @@ -368,33 +374,35 @@ fn acceptance_test_4_concat_no_anon_func() { .lambda("x"), ) .lambda("foldr") - .apply(Term::var("foldr").apply(Term::var("foldr"))) - .lambda("foldr") .apply( - Term::var("xs") - .delayed_choose_list( - Term::var("zero"), - Term::var("f") - .apply(Term::var("x")) - .apply( - Term::var("foldr") - .apply(Term::var("foldr")) - .apply(Term::var("rest")) - .apply(Term::var("f")) - .apply(Term::var("zero")), + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("xs")) + .lambda("foldr") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::var("zero"), + Term::var("f") + .apply(Term::var("x")) + .apply( + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("foldr"), ) .lambda("zero") .lambda("f") - .lambda("xs") - .lambda("foldr"), + .lambda("xs"), ) .apply(Term::list_values(vec![ Constant::Data(Data::integer(1.into())), @@ -1148,35 +1156,39 @@ fn acceptance_test_11_map_empty() { .apply( Term::list_data().apply( Term::var("map") - .lambda("map") - .apply(Term::var("map").apply(Term::var("map"))) .lambda("map") .apply( - Term::var("xs") - .delayed_choose_list( - Term::empty_list(), - Term::mk_cons() - .apply( - Term::i_data() - .apply(Term::var("f").apply(Term::var("x"))), + Term::var("map") + .apply(Term::var("map")) + .apply(Term::var("xs")) + .lambda("map") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::empty_list(), + Term::mk_cons() + .apply( + Term::i_data().apply( + Term::var("f").apply(Term::var("x")), + ), + ) + .apply( + Term::var("map") + .apply(Term::var("map")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .apply( - Term::var("map") - .apply(Term::var("map")) - .apply(Term::var("rest")) - .apply(Term::var("f")), - ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("map"), ) .lambda("f") - .lambda("xs") - .lambda("map"), + .lambda("xs"), ) .apply(Term::empty_list()) .apply( @@ -1215,35 +1227,39 @@ fn acceptance_test_11_map_filled() { .apply( Term::list_data().apply( Term::var("map") - .lambda("map") - .apply(Term::var("map").apply(Term::var("map"))) .lambda("map") .apply( - Term::var("xs") - .delayed_choose_list( - Term::empty_list(), - Term::mk_cons() - .apply( - Term::i_data() - .apply(Term::var("f").apply(Term::var("x"))), + Term::var("map") + .apply(Term::var("map")) + .apply(Term::var("xs")) + .lambda("map") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::empty_list(), + Term::mk_cons() + .apply( + Term::i_data().apply( + Term::var("f").apply(Term::var("x")), + ), + ) + .apply( + Term::var("map") + .apply(Term::var("map")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .apply( - Term::var("map") - .apply(Term::var("map")) - .apply(Term::var("rest")) - .apply(Term::var("f")), - ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("map"), ) .lambda("f") - .lambda("xs") - .lambda("map"), + .lambda("xs"), ) .apply(Term::list_values(vec![ Constant::Data(Data::integer(6.into())), @@ -1296,40 +1312,42 @@ fn acceptance_test_12_filter_even() { .apply( Term::list_data().apply( Term::var("filter") - .lambda("filter") - .apply(Term::var("filter").apply(Term::var("filter"))) .lambda("filter") .apply( - Term::var("xs") - .delayed_choose_list( - Term::empty_list(), - Term::var("f") - .apply(Term::var("x")) - .delayed_if_else( - Term::mk_cons() - .apply(Term::i_data().apply(Term::var("x"))) - .apply( + Term::var("filter") + .apply(Term::var("filter")) + .apply(Term::var("xs")) + .lambda("filter") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::empty_list(), + Term::var("f") + .apply(Term::var("x")) + .delayed_if_else( + Term::mk_cons() + .apply(Term::i_data().apply(Term::var("x"))) + .apply( + Term::var("filter") + .apply(Term::var("filter")) + .apply(Term::var("rest")), + ), Term::var("filter") .apply(Term::var("filter")) - .apply(Term::var("rest")) - .apply(Term::var("f")), - ), - Term::var("filter") - .apply(Term::var("filter")) - .apply(Term::var("rest")) - .apply(Term::var("f")), + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("filter"), ) .lambda("f") - .lambda("xs") - .lambda("filter"), + .lambda("xs"), ) .apply(Term::list_values(vec![ Constant::Data(Data::integer(1.into())), @@ -2008,30 +2026,33 @@ fn acceptance_test_22_filter_map() { .lambda("xs"), ) .lambda("foldr") - .apply(Term::var("foldr").apply(Term::var("foldr"))) - .lambda("foldr") .apply( - Term::var("xs") - .delayed_choose_list( - Term::var("zero"), - Term::var("f") - .apply(Term::var("x")) - .apply( - Term::var("foldr") - .apply(Term::var("foldr")) - .apply(Term::var("rest")) - .apply(Term::var("f")) - .apply(Term::var("zero")), + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("xs")) + .lambda("foldr") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::var("zero"), + Term::var("f") + .apply(Term::var("x")) + .apply( + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::head_list().apply(Term::var("xs"))), ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply(Term::head_list().apply(Term::var("xs"))), + .lambda("xs") + .lambda("foldr"), ) .lambda("zero") .lambda("f") - .lambda("xs") - .lambda("foldr"), + .lambda("xs"), ) .apply(Term::empty_list()) .apply( @@ -2324,32 +2345,35 @@ fn acceptance_test_26_foldr() { .apply( Term::list_data().apply( Term::var("flat_map") - .lambda("flat_map") - .apply(Term::var("flat_map").apply(Term::var("flat_map"))) .lambda("flat_map") .apply( - Term::var("xs") - .delayed_choose_list( - Term::empty_list(), - Term::var("concat") - .apply(Term::var("f").apply(Term::var("x"))) - .apply( - Term::var("flat_map") - .apply(Term::var("flat_map")) - .apply(Term::var("rest")) - .apply(Term::var("f")), + Term::var("flat_map") + .apply(Term::var("flat_map")) + .apply(Term::var("xs")) + .lambda("flat_map") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::empty_list(), + Term::var("concat") + .apply(Term::var("f").apply(Term::var("x"))) + .apply( + Term::var("flat_map") + .apply(Term::var("flat_map")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("flat_map"), ) .lambda("f") - .lambda("xs") - .lambda("flat_map"), + .lambda("xs"), ) .lambda("concat") .apply( @@ -2367,33 +2391,35 @@ fn acceptance_test_26_foldr() { .lambda("left"), ) .lambda("foldr") - .apply(Term::var("foldr").apply(Term::var("foldr"))) - .lambda("foldr") .apply( - Term::var("xs") - .delayed_choose_list( - Term::var("zero"), - Term::var("f") - .apply(Term::var("x")) - .apply( - Term::var("foldr") - .apply(Term::var("foldr")) - .apply(Term::var("rest")) - .apply(Term::var("f")) - .apply(Term::var("zero")), + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("xs")) + .lambda("foldr") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::var("zero"), + Term::var("f") + .apply(Term::var("x")) + .apply( + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("foldr"), ) .lambda("zero") .lambda("f") - .lambda("xs") - .lambda("foldr"), + .lambda("xs"), ) .apply(Term::list_values(vec![ Constant::Data(Data::integer(1.into())), @@ -2460,32 +2486,35 @@ fn acceptance_test_27() { .apply( Term::list_data().apply( Term::var("flat_map") - .lambda("flat_map") - .apply(Term::var("flat_map").apply(Term::var("flat_map"))) .lambda("flat_map") .apply( - Term::var("xs") - .delayed_choose_list( - Term::empty_list(), - Term::var("concat") - .apply(Term::var("f").apply(Term::var("x"))) - .apply( - Term::var("flat_map") - .apply(Term::var("flat_map")) - .apply(Term::var("rest")) - .apply(Term::var("f")), + Term::var("flat_map") + .apply(Term::var("flat_map")) + .apply(Term::var("xs")) + .lambda("flat_map") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::empty_list(), + Term::var("concat") + .apply(Term::var("f").apply(Term::var("x"))) + .apply( + Term::var("flat_map") + .apply(Term::var("flat_map")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("flat_map"), ) .lambda("f") - .lambda("xs") - .lambda("flat_map"), + .lambda("xs"), ) .lambda("concat") .apply( @@ -2503,33 +2532,35 @@ fn acceptance_test_27() { .lambda("left"), ) .lambda("foldr") - .apply(Term::var("foldr").apply(Term::var("foldr"))) - .lambda("foldr") .apply( - Term::var("xs") - .delayed_choose_list( - Term::var("zero"), - Term::var("f") - .apply(Term::var("x")) - .apply( - Term::var("foldr") - .apply(Term::var("foldr")) - .apply(Term::var("rest")) - .apply(Term::var("f")) - .apply(Term::var("zero")), + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("xs")) + .lambda("foldr") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::var("zero"), + Term::var("f") + .apply(Term::var("x")) + .apply( + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("foldr"), ) .lambda("zero") .lambda("f") - .lambda("xs") - .lambda("foldr"), + .lambda("xs"), ) .apply(Term::list_values(vec![ Constant::Data(Data::integer(1.into())), @@ -2596,32 +2627,35 @@ fn acceptance_test_30() { .apply( Term::list_data().apply( Term::var("flat_map") - .lambda("flat_map") - .apply(Term::var("flat_map").apply(Term::var("flat_map"))) .lambda("flat_map") .apply( - Term::var("xs") - .delayed_choose_list( - Term::empty_list(), - Term::var("concat") - .apply(Term::var("f").apply(Term::var("x"))) - .apply( - Term::var("flat_map") - .apply(Term::var("flat_map")) - .apply(Term::var("rest")) - .apply(Term::var("f")), + Term::var("flat_map") + .apply(Term::var("flat_map")) + .apply(Term::var("xs")) + .lambda("flat_map") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::empty_list(), + Term::var("concat") + .apply(Term::var("f").apply(Term::var("x"))) + .apply( + Term::var("flat_map") + .apply(Term::var("flat_map")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("flat_map"), ) .lambda("f") - .lambda("xs") - .lambda("flat_map"), + .lambda("xs"), ) .lambda("concat") .apply( @@ -2639,33 +2673,35 @@ fn acceptance_test_30() { .lambda("left"), ) .lambda("foldr") - .apply(Term::var("foldr").apply(Term::var("foldr"))) - .lambda("foldr") .apply( - Term::var("xs") - .delayed_choose_list( - Term::var("zero"), - Term::var("f") - .apply(Term::var("x")) - .apply( - Term::var("foldr") - .apply(Term::var("foldr")) - .apply(Term::var("rest")) - .apply(Term::var("f")) - .apply(Term::var("zero")), + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("xs")) + .lambda("foldr") + .apply( + Term::var("xs") + .delayed_choose_list( + Term::var("zero"), + Term::var("f") + .apply(Term::var("x")) + .apply( + Term::var("foldr") + .apply(Term::var("foldr")) + .apply(Term::var("rest")), + ) + .lambda("rest") + .apply(Term::tail_list().apply(Term::var("xs"))) + .lambda("x") + .apply(Term::un_i_data().apply( + Term::head_list().apply(Term::var("xs")), + )), ) - .lambda("rest") - .apply(Term::tail_list().apply(Term::var("xs"))) - .lambda("x") - .apply( - Term::un_i_data() - .apply(Term::head_list().apply(Term::var("xs"))), - ), + .lambda("xs") + .lambda("foldr"), ) .lambda("zero") .lambda("f") - .lambda("xs") - .lambda("foldr"), + .lambda("xs"), ) .apply(Term::list_values(vec![ Constant::Data(Data::integer(1.into())),