aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/eval.rs12
-rw-r--r--src/parser.rs43
2 files changed, 44 insertions, 11 deletions
diff --git a/src/eval.rs b/src/eval.rs
index c11614d..7c6ef5d 100644
--- a/src/eval.rs
+++ b/src/eval.rs
@@ -116,6 +116,18 @@ impl Num {
float(self.as_float().tan())
}
+ pub fn asin(self) -> Num {
+ float(self.as_float().asin())
+ }
+
+ pub fn acos(self) -> Num {
+ float(self.as_float().acos())
+ }
+
+ pub fn atan(self) -> Num {
+ float(self.as_float().atan())
+ }
+
pub fn sqrt(self) -> Num {
match self {
Num::Int(i) if i >= 0 => {
diff --git a/src/parser.rs b/src/parser.rs
index badf286..0875d92 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -80,77 +80,98 @@ impl<'a> Parser<'a> {
if self.symbol("sin") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::sin),
+ eval: Box::new(Num::sin),
});
return true;
}
if self.symbol("cos") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::cos),
+ eval: Box::new(Num::cos),
});
return true;
}
if self.symbol("tan") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::tan),
+ eval: Box::new(Num::tan),
+ });
+ return true;
+ }
+ if self.symbol("asin") || self.symbol("arcsin") {
+ self.stack.push(Op::Op {
+ prec: 3,
+ eval: Box::new(Num::asin),
+ });
+ return true;
+ }
+ if self.symbol("acos") || self.symbol("arccos") {
+ self.stack.push(Op::Op {
+ prec: 3,
+ eval: Box::new(Num::acos),
+ });
+ return true;
+ }
+ if self.symbol("atan") || self.symbol("arctan") {
+ self.stack.push(Op::Op {
+ prec: 3,
+ eval: Box::new(Num::atan),
});
return true;
}
if self.symbol("sqrt") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::sqrt),
+ eval: Box::new(Num::sqrt),
});
return true;
}
if self.symbol("log") || self.symbol("ln") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::log),
+ eval: Box::new(Num::log),
});
return true;
}
if self.symbol("log10") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::log10),
+ eval: Box::new(Num::log10),
});
return true;
}
if self.symbol("log2") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::log2),
+ eval: Box::new(Num::log2),
});
return true;
}
if self.symbol("floor") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::floor),
+ eval: Box::new(Num::floor),
});
return true;
}
if self.symbol("ceil") || self.symbol("ceiling") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::ceil),
+ eval: Box::new(Num::ceil),
});
return true;
}
if self.symbol("round") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::round),
+ eval: Box::new(Num::round),
});
return true;
}
if self.symbol("abs") {
self.stack.push(Op::Op {
prec: 3,
- eval: Box::new(eval::Num::abs),
+ eval: Box::new(Num::abs),
});
return true;
}