From 00e9dabe825727a2dd611fc08a8a366d15f2759e Mon Sep 17 00:00:00 2001 From: KtorZ Date: Wed, 22 Feb 2023 12:53:03 +0100 Subject: [PATCH] Add missing Plutus builtins to Aiken's lang. --- crates/aiken-lang/src/builtins.rs | 70 +++++++++++++++++++++++++------ crates/uplc/src/builtins.rs | 6 +-- 2 files changed, 60 insertions(+), 16 deletions(-) diff --git a/crates/aiken-lang/src/builtins.rs b/crates/aiken-lang/src/builtins.rs index eaa8183c..e3099568 100644 --- a/crates/aiken-lang/src/builtins.rs +++ b/crates/aiken-lang/src/builtins.rs @@ -579,21 +579,65 @@ pub fn from_default_function( Some((tipo, 1)) } DefaultFunction::ChooseData => { - let tipo = function(vec![data(), data(), data(), data(), data(), data()], data()); + let a = generic_var(id_gen.next()); + let tipo = function( + vec![ + data(), + a.clone(), + a.clone(), + a.clone(), + a.clone(), + a.clone(), + ], + a, + ); Some((tipo, 6)) } - - // Anything below has a direct syntax equivalent in Aiken, so - // there's no need to support builtin for those. - DefaultFunction::MkPairData => None, - DefaultFunction::MkNilData => None, - DefaultFunction::MkNilPairData => None, - DefaultFunction::ChooseUnit => None, - DefaultFunction::Trace => None, - DefaultFunction::FstPair => None, - DefaultFunction::SndPair => None, - DefaultFunction::ChooseList => None, - DefaultFunction::MkCons => None, + DefaultFunction::MkPairData => { + let tipo = function(vec![data(), data()], tuple(vec![data(), data()])); + Some((tipo, 2)) + } + DefaultFunction::MkNilData => { + let tipo = function(vec![], list(data())); + Some((tipo, 0)) + } + DefaultFunction::MkNilPairData => { + let tipo = function(vec![], list(tuple(vec![data(), data()]))); + Some((tipo, 0)) + } + DefaultFunction::ChooseUnit => { + let a = generic_var(id_gen.next()); + let tipo = function(vec![data(), a.clone()], a); + Some((tipo, 2)) + } + DefaultFunction::Trace => { + let a = generic_var(id_gen.next()); + let tipo = function(vec![string(), a.clone()], a); + Some((tipo, 2)) + } + DefaultFunction::FstPair => { + let a = generic_var(id_gen.next()); + let b = generic_var(id_gen.next()); + let tipo = function(vec![tuple(vec![a.clone(), b])], a); + Some((tipo, 1)) + } + DefaultFunction::SndPair => { + let a = generic_var(id_gen.next()); + let b = generic_var(id_gen.next()); + let tipo = function(vec![tuple(vec![a, b.clone()])], b); + Some((tipo, 1)) + } + DefaultFunction::ChooseList => { + let a = generic_var(id_gen.next()); + let b = generic_var(id_gen.next()); + let tipo = function(vec![list(a), b.clone(), b.clone()], b); + Some((tipo, 3)) + } + DefaultFunction::MkCons => { + let a = generic_var(id_gen.next()); + let tipo = function(vec![a.clone(), list(a.clone())], list(a)); + Some((tipo, 2)) + } }; info.map(|(tipo, arity)| { diff --git a/crates/uplc/src/builtins.rs b/crates/uplc/src/builtins.rs index f7c40587..d583b010 100644 --- a/crates/uplc/src/builtins.rs +++ b/crates/uplc/src/builtins.rs @@ -361,12 +361,12 @@ impl DefaultFunction { EncodeUtf8 => "encode_utf8", DecodeUtf8 => "decode_utf8", IfThenElse => "if_then_else", - ChooseUnit => "choose_unit", - Trace => "trace", + ChooseUnit => "choose_void", + Trace => "debug", FstPair => "fst_pair", SndPair => "snd_pair", ChooseList => "choose_list", - MkCons => "mk_cons", + MkCons => "cons_list", HeadList => "head_list", TailList => "tail_list", NullList => "null_list",