use std::sync::Arc;
use std::fmt;
use super::Expr;
#[derive(Clone, PartialEq, Debug)]
pub enum Symbol {
Any,
Var(Arc<String>),
HeadTail(Box<Expr>, Box<Expr>),
RetVar(Arc<String>),
BinopRetVar(Arc<String>, Arc<String>, Box<Symbol>),
UnopRetVar(Arc<String>, Box<Symbol>),
NoConstrVar(Arc<String>),
False1,
Not,
Idb,
True1,
False2,
True2,
And,
Or,
Eqb,
Xor,
Nand,
Nor,
Exc,
Imply,
Fstb,
Sndb,
Even,
Odd,
Lt,
Le,
Gt,
Ge,
Neg,
Add,
Sub,
Mul,
Div,
Rem,
Pow,
Rpow,
Sqrt,
Ln,
Log2,
Log10,
Exp,
Len,
Concat,
Sum,
Min2,
Max2,
Min,
Max,
MulMat,
Det,
Dim,
Fst,
Snd,
Sin,
Asin,
Cos,
Acos,
Tan,
Atan,
Atan2,
Id,
Eq,
Neq,
If,
Ex,
Triv,
}
impl fmt::Display for Symbol {
fn fmt(&self, w: &mut fmt::Formatter<'_>) -> std::result::Result<(), fmt::Error> {
use Symbol::*;
match self {
False1 => write!(w, "false1")?,
Not => write!(w, "not")?,
Idb => write!(w, "idb")?,
True1 => write!(w, "true1")?,
False2 => write!(w, "false2")?,
True2 => write!(w, "true2")?,
And => write!(w, "and")?,
Or => write!(w, "or")?,
Eqb => write!(w, "eqb")?,
Xor => write!(w, "xor")?,
Nand => write!(w, "nand")?,
Nor => write!(w, "nor")?,
Exc => write!(w, "exc")?,
Imply => write!(w, "imply")?,
Fstb => write!(w, "fstb")?,
Sndb => write!(w, "sndb")?,
Even => write!(w, "even")?,
Odd => write!(w, "odd")?,
Lt => write!(w, "lt")?,
Le => write!(w, "le")?,
Gt => write!(w, "gt")?,
Ge => write!(w, "ge")?,
Neg => write!(w, "neg")?,
Add => write!(w, "add")?,
Sub => write!(w, "sub")?,
Mul => write!(w, "mul")?,
Div => write!(w, "div")?,
Rem => write!(w, "rem")?,
Pow => write!(w, "pow")?,
Rpow => write!(w, "rpow")?,
Sqrt => write!(w, "sqrt")?,
Ln => write!(w, "ln")?,
Log2 => write!(w, "log2")?,
Log10 => write!(w, "log10")?,
Exp => write!(w, "exp")?,
Len => write!(w, "len")?,
Concat => write!(w, "concat")?,
Sum => write!(w, "sum")?,
Min2 => write!(w, "min2")?,
Max2 => write!(w, "max2")?,
Min => write!(w, "min")?,
Max => write!(w, "max")?,
MulMat => write!(w, "mul_mat")?,
Det => write!(w, "det")?,
Dim => write!(w, "dim")?,
Fst => write!(w, "fst")?,
Snd => write!(w, "snd")?,
Sin => write!(w, "sin")?,
Asin => write!(w, "asin")?,
Cos => write!(w, "cos")?,
Acos => write!(w, "acos")?,
Tan => write!(w, "tan")?,
Atan => write!(w, "atan")?,
Atan2 => write!(w, "atan2")?,
Id => write!(w, "id")?,
Eq => write!(w, "eq")?,
Neq => write!(w, "neq")?,
If => write!(w, "if")?,
Any => write!(w, "_")?,
Ex => write!(w, "∃")?,
Triv => write!(w, "∀")?,
Var(x) | NoConstrVar(x) => write!(w, "{}", x)?,
RetVar(x) => write!(w, "\\{}", x)?,
HeadTail(x, y) => write!(w, "[{}, {}..]", x, y)?,
BinopRetVar(x, y, f) => {
match **f {
Lt => write!(w, "{} < {}", x, y)?,
Le => write!(w, "{} <= {}", x, y)?,
Gt => write!(w, "{} > {}", x, y)?,
Ge => write!(w, "{} >= {}", x, y)?,
Add => write!(w, "{} + {}", x, y)?,
Sub => write!(w, "{} - {}", x, y)?,
Mul => write!(w, "{} * {}", x, y)?,
Div => write!(w, "{} / {}", x, y)?,
Eq => write!(w, "{} == {}", x, y)?,
Concat => write!(w, "{} ++ {}", x, y)?,
_ => write!(w, "{:?}", self)?,
}
}
UnopRetVar(x, f) => {
match **f {
Neg => write!(w, "-{}", x)?,
Len => write!(w, "compute::len({})", x)?,
_ => write!(w, "{:?}", self)?,
}
}
}
Ok(())
}
}