pub mod gen_map_get;
mod order_kwargs;
pub mod parser;
pub mod to_fun;
use crate::fun::{Name, Num, Op, Source, Type};
use interner::global::GlobalString;
#[derive(Clone, Debug)]
pub enum Expr {
Era,
Var { nam: Name },
Chn { nam: Name },
Num { val: Num },
Call { fun: Box<Expr>, args: Vec<Expr>, kwargs: Vec<(Name, Expr)> },
Lam { names: Vec<(Name, bool)>, bod: Box<Expr> },
Opr { op: Op, lhs: Box<Expr>, rhs: Box<Expr> },
Str { val: GlobalString },
Lst { els: Vec<Expr> },
Tup { els: Vec<Expr> },
Sup { els: Vec<Expr> },
Ctr { name: Name, args: Vec<Expr>, kwargs: Vec<(Name, Expr)> },
LstMap { term: Box<Expr>, bind: Name, iter: Box<Expr>, cond: Option<Box<Expr>> },
Map { entries: Vec<(Expr, Expr)> },
MapGet { nam: Name, key: Box<Expr> },
TreeNode { left: Box<Expr>, right: Box<Expr> },
TreeLeaf { val: Box<Expr> },
}
#[derive(Clone, Debug)]
pub struct MatchArm {
pub lft: Option<Name>,
pub rgt: Stmt,
}
#[derive(Clone, Debug, Default)]
pub enum AssignPattern {
#[default]
Eraser,
Var(Name),
Chn(Name),
Tup(Vec<AssignPattern>),
Sup(Vec<AssignPattern>),
MapSet(Name, Expr),
}
#[derive(Clone, Debug)]
pub enum InPlaceOp {
Add,
Sub,
Mul,
Div,
And,
Or,
Xor,
Map,
}
#[derive(Clone, Debug, Default)]
pub enum Stmt {
Assign {
pat: AssignPattern,
val: Box<Expr>,
nxt: Option<Box<Stmt>>,
},
InPlace {
op: InPlaceOp,
pat: Box<AssignPattern>,
val: Box<Expr>,
nxt: Box<Stmt>,
},
If {
cond: Box<Expr>,
then: Box<Stmt>,
otherwise: Box<Stmt>,
nxt: Option<Box<Stmt>>,
},
Match {
arg: Box<Expr>,
bnd: Option<Name>,
with_bnd: Vec<Option<Name>>,
with_arg: Vec<Expr>,
arms: Vec<MatchArm>,
nxt: Option<Box<Stmt>>,
},
Switch {
arg: Box<Expr>,
bnd: Option<Name>,
with_bnd: Vec<Option<Name>>,
with_arg: Vec<Expr>,
arms: Vec<Stmt>,
nxt: Option<Box<Stmt>>,
},
Bend {
bnd: Vec<Option<Name>>,
arg: Vec<Expr>,
cond: Box<Expr>,
step: Box<Stmt>,
base: Box<Stmt>,
nxt: Option<Box<Stmt>>,
},
Fold {
arg: Box<Expr>,
bnd: Option<Name>,
with_bnd: Vec<Option<Name>>,
with_arg: Vec<Expr>,
arms: Vec<MatchArm>,
nxt: Option<Box<Stmt>>,
},
With {
typ: Name,
bod: Box<Stmt>,
nxt: Option<Box<Stmt>>,
},
Ask {
pat: AssignPattern,
val: Box<Expr>,
nxt: Option<Box<Stmt>>,
},
Return {
term: Box<Expr>,
},
Open {
typ: Name,
var: Name,
nxt: Box<Stmt>,
},
Use {
nam: Name,
val: Box<Expr>,
nxt: Box<Stmt>,
},
LocalDef {
def: Box<Definition>,
nxt: Box<Stmt>,
},
#[default]
Err,
}
#[derive(Clone, Debug)]
pub struct Definition {
pub name: Name,
pub typ: Type,
pub check: bool,
pub args: Vec<Name>,
pub body: Stmt,
pub source: Source,
}
impl InPlaceOp {
pub fn to_lang_op(self) -> Op {
match self {
InPlaceOp::Add => Op::ADD,
InPlaceOp::Sub => Op::SUB,
InPlaceOp::Mul => Op::MUL,
InPlaceOp::Div => Op::DIV,
InPlaceOp::And => Op::AND,
InPlaceOp::Or => Op::OR,
InPlaceOp::Xor => Op::XOR,
InPlaceOp::Map => unreachable!(),
}
}
}