start testing the first stage of currying builtins
This commit is contained in:
parent
249581e1bc
commit
4015550f55
|
@ -26,6 +26,7 @@ pub fn aiken_optimize_and_intern(program: Program<Name>) -> Program<Name> {
|
||||||
.cast_data_reducer()
|
.cast_data_reducer()
|
||||||
.lambda_reducer()
|
.lambda_reducer()
|
||||||
.inline_reducer()
|
.inline_reducer()
|
||||||
|
.builtin_curry_reducer()
|
||||||
.lambda_reducer()
|
.lambda_reducer()
|
||||||
.inline_reducer()
|
.inline_reducer()
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ use crate::{
|
||||||
ast::{Constant, Data, Name, Program, Term, Type},
|
ast::{Constant, Data, Name, Program, Term, Type},
|
||||||
builtins::DefaultFunction,
|
builtins::DefaultFunction,
|
||||||
};
|
};
|
||||||
#[derive(PartialEq, Clone)]
|
#[derive(PartialEq, Clone, Debug)]
|
||||||
pub enum BuiltinArgs {
|
pub enum BuiltinArgs {
|
||||||
TwoArgs(Term<Name>, Term<Name>),
|
TwoArgs(Term<Name>, Term<Name>),
|
||||||
ThreeArgs(Term<Name>, Term<Name>, Term<Name>),
|
ThreeArgs(Term<Name>, Term<Name>, Term<Name>),
|
||||||
|
@ -51,7 +51,7 @@ impl BuiltinArgs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Clone)]
|
#[derive(PartialEq, Clone, Debug)]
|
||||||
pub enum CurriedTree {
|
pub enum CurriedTree {
|
||||||
Branch {
|
Branch {
|
||||||
node: Term<Name>,
|
node: Term<Name>,
|
||||||
|
@ -81,6 +81,19 @@ impl CurriedTree {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn multiple_occurrences(&self) -> bool {
|
||||||
|
match self {
|
||||||
|
CurriedTree::Branch {
|
||||||
|
multiple_occurrences,
|
||||||
|
..
|
||||||
|
} => *multiple_occurrences,
|
||||||
|
CurriedTree::Leaf {
|
||||||
|
multiple_occurrences,
|
||||||
|
..
|
||||||
|
} => *multiple_occurrences,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn merge_node_by_path(self, path: BuiltinArgs, scope: &Scope) -> CurriedTree {
|
pub fn merge_node_by_path(self, path: BuiltinArgs, scope: &Scope) -> CurriedTree {
|
||||||
match (self, path) {
|
match (self, path) {
|
||||||
(
|
(
|
||||||
|
@ -188,9 +201,20 @@ impl CurriedTree {
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn prune_single_occurrences(self) -> Self {
|
||||||
|
match self {
|
||||||
|
CurriedTree::Branch { node, children, .. } => {
|
||||||
|
// Implement your logic here for the Branch variant
|
||||||
|
// For example, you might want to prune children here
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Clone)]
|
#[derive(PartialEq, Clone, Debug)]
|
||||||
pub struct CurriedBuiltin {
|
pub struct CurriedBuiltin {
|
||||||
pub func: DefaultFunction,
|
pub func: DefaultFunction,
|
||||||
/// For use with subtract integer where we can flip the order of the arguments
|
/// For use with subtract integer where we can flip the order of the arguments
|
||||||
|
@ -259,15 +283,25 @@ impl CurriedBuiltin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn prune_single_occurrences(mut self) -> Self {
|
||||||
|
self.children = self
|
||||||
|
.children
|
||||||
|
.into_iter()
|
||||||
|
.filter(|child| child.multiple_occurrences())
|
||||||
|
.map(|child| child.prune_single_occurrences())
|
||||||
|
.collect_vec();
|
||||||
|
self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Eq, Hash, PartialEq, Clone)]
|
#[derive(Eq, Hash, PartialEq, Clone, Debug)]
|
||||||
pub enum ScopePath {
|
pub enum ScopePath {
|
||||||
FUNC,
|
FUNC,
|
||||||
ARG,
|
ARG,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Eq, Hash, PartialEq, Clone)]
|
#[derive(Eq, Hash, PartialEq, Clone, Debug)]
|
||||||
pub struct Scope {
|
pub struct Scope {
|
||||||
scope: Vec<ScopePath>,
|
scope: Vec<ScopePath>,
|
||||||
}
|
}
|
||||||
|
@ -361,7 +395,6 @@ pub fn can_curry_builtin(func: DefaultFunction) -> bool {
|
||||||
| DefaultFunction::AppendByteString
|
| DefaultFunction::AppendByteString
|
||||||
| DefaultFunction::ConsByteString
|
| DefaultFunction::ConsByteString
|
||||||
| DefaultFunction::SliceByteString
|
| DefaultFunction::SliceByteString
|
||||||
| DefaultFunction::LengthOfByteString
|
|
||||||
| DefaultFunction::IndexByteString
|
| DefaultFunction::IndexByteString
|
||||||
| DefaultFunction::Bls12_381_G1_Add
|
| DefaultFunction::Bls12_381_G1_Add
|
||||||
| DefaultFunction::Bls12_381_G2_Add
|
| DefaultFunction::Bls12_381_G2_Add
|
||||||
|
@ -827,7 +860,7 @@ impl Program<Name> {
|
||||||
let mut curried_terms = vec![];
|
let mut curried_terms = vec![];
|
||||||
let mut curry_applied_ids: Vec<usize> = vec![];
|
let mut curry_applied_ids: Vec<usize> = vec![];
|
||||||
|
|
||||||
self.traverse_uplc_with(&mut |_id, term, arg_stack, scope| match term {
|
let a = self.traverse_uplc_with(&mut |_id, term, arg_stack, scope| match term {
|
||||||
Term::Builtin(func) => {
|
Term::Builtin(func) => {
|
||||||
if can_curry_builtin(*func) && arg_stack.len() == func.arity() {
|
if can_curry_builtin(*func) && arg_stack.len() == func.arity() {
|
||||||
let mut scope = scope.clone();
|
let mut scope = scope.clone();
|
||||||
|
@ -878,6 +911,7 @@ impl Program<Name> {
|
||||||
ordered_arg_stack.next().unwrap(),
|
ordered_arg_stack.next().unwrap(),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
// println!("ARG STACK FOR FUNC {:#?}, {:#?}", ordered_arg_stack, func);
|
||||||
BuiltinArgs::ThreeArgs(
|
BuiltinArgs::ThreeArgs(
|
||||||
ordered_arg_stack.next().unwrap(),
|
ordered_arg_stack.next().unwrap(),
|
||||||
ordered_arg_stack.next().unwrap(),
|
ordered_arg_stack.next().unwrap(),
|
||||||
|
@ -909,7 +943,14 @@ impl Program<Name> {
|
||||||
Term::Constr { .. } => todo!(),
|
Term::Constr { .. } => todo!(),
|
||||||
Term::Case { .. } => todo!(),
|
Term::Case { .. } => todo!(),
|
||||||
_ => {}
|
_ => {}
|
||||||
})
|
});
|
||||||
|
|
||||||
|
println!("CURRIED ARGS");
|
||||||
|
for (index, curried_term) in curried_terms.into_iter().enumerate() {
|
||||||
|
println!("index is {:#?}, term is {:#?}", index, curried_term,);
|
||||||
|
}
|
||||||
|
|
||||||
|
a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue