enum Expr { Lit(i64), Add(Box, Box), Mul(Box, Box) } fn eval(e: &Expr) -> i64 { match e { Expr::Lit(n) => *n, Expr::Add(a, b) => eval(a) + eval(b), Expr::Mul(a, b) => eval(a) * eval(b), } } fn main() { let expr = Expr::Mul( Box::new(Expr::Add(Box::new(Expr::Lit(2)), Box::new(Expr::Lit(3)))), Box::new(Expr::Lit(4)), ); println!("{}", eval(&expr)); }