use std::sync::Arc;
use std::fmt;
use super::Expr;
#[derive(Clone, PartialEq, Debug)]
pub enum Symbol {
Any,
Var(Arc<String>),
ArityVar(Arc<String>, usize),
ListVar(Arc<String>),
Singleton(Arc<String>),
HeadTailTup(Box<Expr>, Box<Expr>),
HeadTailList(Box<Expr>, Box<Expr>),
RetVar(Arc<String>),
RetIntVar(Arc<String>),
RetPosVar(Arc<String>),
RetNegVar(Arc<String>),
NotRetVar(Arc<String>),
BinopRetVar(Arc<String>, Arc<String>, Box<Symbol>),
TernopRetVar(Arc<String>, 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,
Abs,
Lt,
Rlt,
Le,
Rle,
Gt,
Rgt,
Ge,
Rge,
Neg,
Reci,
Conj,
Norm,
Sqnorm,
Add,
Sub,
Mul,
Mulc,
Div,
Rem,
Pow,
Rpow,
Sqrt,
Ln,
Log2,
Log10,
Exp,
Len,
Concat,
Sum,
Min2,
Max2,
Min,
Max,
Range,
Rangel,
Ranger,
Rangem,
Prob,
Probl,
Probr,
Probm,
MulMat,
Det,
Dim,
IsSquareMat,
Base,
Fst,
Snd,
Sin,
Asin,
Cos,
Acos,
Tan,
Atan,
Atan2,
Dot,
Push,
PushFront,
Item,
El,
Re,
Im,
Id,
Eq,
Neq,
D,
Integ,
If,
Ex,
Triv,
RetType,
VecType,
Rty,
VecOp,
VecUop,
Arity,
Pi,
Tau,
Eps,
Imag,
Imag2,
Imag3,
TypeOf,
BoolType,
F64Type,
QuatType,
Inf,
}
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")?,
Abs => write!(w, "abs")?,
Lt => write!(w, "lt")?,
Rlt => write!(w, "rlt")?,
Le => write!(w, "le")?,
Rle => write!(w, "rle")?,
Gt => write!(w, "gt")?,
Rgt => write!(w, "rgt")?,
Ge => write!(w, "ge")?,
Rge => write!(w, "rge")?,
Neg => write!(w, "neg")?,
Reci => write!(w, "reci")?,
Conj => write!(w, "conj")?,
Norm => write!(w, "norm")?,
Sqnorm => write!(w, "sqnorm")?,
Add => write!(w, "add")?,
Sub => write!(w, "sub")?,
Mul => write!(w, "mul")?,
Mulc => write!(w, "mulc")?,
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")?,
Range => write!(w, "range")?,
Rangel => write!(w, "rangel")?,
Ranger => write!(w, "ranger")?,
Rangem => write!(w, "rangem")?,
Prob => write!(w, "prob")?,
Probl => write!(w, "probl")?,
Probr => write!(w, "probr")?,
Probm => write!(w, "probm")?,
MulMat => write!(w, "mul_mat")?,
Det => write!(w, "det")?,
Dim => write!(w, "dim")?,
IsSquareMat => write!(w, "is_square_mat")?,
Base => write!(w, "base")?,
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")?,
Dot => write!(w, "dot")?,
Push => write!(w, "push")?,
PushFront => write!(w, "push_front")?,
Item => write!(w, "item")?,
El => write!(w, "el")?,
Re => write!(w, "re")?,
Im => write!(w, "im")?,
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, "∀")?,
RetType => write!(w, "\\")?,
VecType => write!(w, "vec")?,
Rty => write!(w, "rty")?,
VecOp => write!(w, "vec_op")?,
VecUop => write!(w, "vec_uop")?,
Arity => write!(w, "arity")?,
D => write!(w, "d")?,
Integ => write!(w, "∫")?,
Pi => write!(w, "π")?,
Tau => write!(w, "τ")?,
Eps => write!(w, "ε")?,
Imag => write!(w, "𝐢")?,
Imag2 => write!(w, "𝐢₂")?,
Imag3 => write!(w, "𝐢₃")?,
TypeOf => write!(w, "type_of")?,
BoolType => write!(w, "bool")?,
F64Type => write!(w, "f64")?,
QuatType => write!(w, "quat")?,
Inf => write!(w, "∞")?,
Var(x) | NoConstrVar(x) => write!(w, "{}", x)?,
ArityVar(x, _) => write!(w, "{}", x)?,
RetVar(x) => write!(w, "\\{}", x)?,
RetIntVar(x) => write!(w, "\\{}:int", x)?,
RetPosVar(x) => write!(w, "\\{}:(>= 0)", x)?,
RetNegVar(x) => write!(w, "\\{}:(< 0)", x)?,
NotRetVar(x) => write!(w, "!\\{}", x)?,
ListVar(x) => write!(w, "[{}..]", x)?,
Singleton(x) => write!(w, "[{}]", x)?,
HeadTailTup(x, y) => write!(w, "({}, {}..)", x, y)?,
HeadTailList(x, y) => write!(w, "[{}, {}..]", x, y)?,
BinopRetVar(x, y, f) => {
match **f {
Lt => write!(w, "compute::lt({}, {})", x, y)?,
Le => write!(w, "compute::le({}, {})", x, y)?,
Gt => write!(w, "compute::gt({}, {})", x, y)?,
Ge => write!(w, "compute::ge({}, {})", x, y)?,
Add => write!(w, "compute::add({}, {})", x, y)?,
Sub => write!(w, "compute::sub({}, {})", x, y)?,
Mul => write!(w, "compute::mul({}, {})", x, y)?,
Div => write!(w, "compute::div({}, {})", x, y)?,
Pow => write!(w, "compute::pow({}, {})", x, y)?,
Rem => write!(w, "compute::rem({}, {})", x, y)?,
Eq => write!(w, "compute::eq({}, {})", x, y)?,
Concat => write!(w, "compute::concat({}, {})", x, y)?,
Push => write!(w, "compute::push({}, {})", x, y)?,
PushFront => write!(w, "compute::push_front({}, {})", x, y)?,
Max2 => write!(w, "compute::max2({}, {})", x, y)?,
Min2 => write!(w, "compute::min2({}, {})", x, y)?,
Item => write!(w, "compute::item({}, {})", x, y)?,
Base => write!(w, "compute::base({}, {})", x, y)?,
Atan2 => write!(w, "compute::atan2({}, {})", x, y)?,
_ => write!(w, "{:?}", self)?,
}
}
TernopRetVar(x, y, z, f) => {
match **f {
Range => write!(w, "compute::range({}, {}, {})", x, y, z)?,
Rangel => write!(w, "compute::rangel({}, {}, {})", x, y, z)?,
Ranger => write!(w, "compute::ranger({}, {}, {})", x, y, z)?,
Rangem => write!(w, "compute::rangem({}, {}, {})", x, y, z)?,
_ => write!(w, "{:?}", self)?,
}
}
UnopRetVar(x, f) => {
match **f {
Neg => write!(w, "compute::neg({})", x)?,
Reci => write!(w, "compute::reci({})", x)?,
Abs => write!(w, "compute::abs({})", x)?,
Len => write!(w, "compute::len({})", x)?,
Prob => write!(w, "compute::prob({})", x)?,
Probl => write!(w, "compute::probl({})", x)?,
Probr => write!(w, "compute::probr({})", x)?,
Probm => write!(w, "compute::probm({})", x)?,
Sqrt => write!(w, "compute::sqrt({})", x)?,
Ln => write!(w, "compute::ln({})", x)?,
Log2 => write!(w, "compute::log2({})", x)?,
Log10 => write!(w, "compute::log10({})", x)?,
Exp => write!(w, "compute::exp({})", x)?,
Sin => write!(w, "compute::sin({})", x)?,
Asin => write!(w, "compute::asin({})", x)?,
Cos => write!(w, "compute::cos({})", x)?,
Acos => write!(w, "compute::acos({})", x)?,
Tan => write!(w, "compute::tan({})", x)?,
Atan => write!(w, "compute::atan({})", x)?,
IsSquareMat => write!(w, "compute::is_square_mat({})", x)?,
Arity => write!(w, "compute::arity({})", x)?,
TypeOf => write!(w, "compute::type_of({})", x)?,
_ => write!(w, "{:?}", self)?,
}
}
}
Ok(())
}
}