From 533d73997b279551583d97b0d5523272b83330d9 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Thu, 30 May 2024 08:18:00 -0700 Subject: Add arcsin, arccos, arctan. --- src/eval.rs | 12 ++++++++++++ src/parser.rs | 43 ++++++++++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 11 deletions(-) (limited to 'src') 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; } -- cgit v1.3.1