betareduction/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use aleph_syntax_tree::syntax::AlephTree as at;

fn beta(ast: at, env:Vec<String>) -> at {
    match ast {

        at::Length{var} => at::Length{var: var},

        at::Neg{expr} => at::Neg{expr:Box::new(beta(*expr, env))},

        at::And{bool_expr1,bool_expr2} => at::And{bool_expr1: Box::new(beta(*bool_expr1, env.clone())), bool_expr2: Box::new(beta(*bool_expr2, env))},

        at::Or{bool_expr1,bool_expr2} => at::Or{bool_expr1: Box::new(beta(*bool_expr1, env.clone())), bool_expr2: Box::new(beta(*bool_expr2, env))},

        at::Eq{expr1,expr2} => at::Eq{expr1: Box::new(beta(*expr1, env.clone())), expr2: Box::new(beta(*expr2, env))},

        at::LE{expr1,expr2} => at::LE{expr1: Box::new(beta(*expr1, env.clone())), expr2: Box::new(beta(*expr2, env))},

        at::Add{number_expr1, number_expr2} => at::Add{number_expr1: Box::new(beta(*number_expr1, env.clone())), number_expr2: Box::new(beta(*number_expr2, env))},

        at::Sub{number_expr1,number_expr2} => at::Sub{number_expr1: Box::new(beta(*number_expr1, env.clone())), number_expr2: Box::new(beta(*number_expr2, env))},

        at::Mul{number_expr1,number_expr2} => at::Mul{number_expr1: Box::new(beta(*number_expr1, env.clone())), number_expr2: Box::new(beta(*number_expr2, env))},

        at::Div{number_expr1,number_expr2} => at::Div{number_expr1: Box::new(beta(*number_expr1, env.clone())), number_expr2: Box::new(beta(*number_expr2, env))},

        at::If{condition, then, els} => at::If{condition:condition , then:Box::new(beta(*then, env.clone())), els:Box::new(beta(*els, env))},

        at::Stmts{expr1,expr2} => at::Stmts{expr1:Box::new(beta(*expr1, env.clone())), expr2:Box::new(beta(*expr2, env))},

        at::While{init_expr, condition, loop_expr, post_expr} => at::While{
            init_expr:Box::new(beta(*init_expr, env.clone())),
            condition:Box::new(beta(*condition, env.clone())),
            loop_expr:Box::new(beta(*loop_expr, env.clone())),
            post_expr:Box::new(beta(*post_expr, env.clone()))},

        _ => ast
    }
}

pub fn transform(ast: at) -> at{
    beta(ast, vec![])
}