use super::types::*; pub fn name(str: &str) -> Name { Name(str.into()) } pub fn label(str: &str) -> Label { Label(str.into()) } pub fn var(str: &str) -> Expr { Expr::Var(name(str)) } pub fn record(rec: Vec<(&str, Expr)>) -> Expr { Expr::Record( rec.into_iter() .map(|(lbl, val)| (Label(lbl.into()), val)) .collect(), ) } pub fn assign(name: &str, expr: Expr) -> Statement { Statement::Let(define_expr(name, expr)) } pub fn stmt_expr(expr: Expr) -> Statement { Statement::Expr(expr) } pub fn define_expr(name: &str, expr: Expr) -> Definition { Definition { mutable: false, name: name.into(), expr, } } pub fn func(args: Vec, body: Expr) -> Expr { Expr::Func(Box::new(Fn { args, body })) }