From 27c5539c0aa8e7df2947d9addbab90b2df8c3a3d Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Sun, 26 Dec 2021 13:53:22 +0100 Subject: Add `exp(x)` function which evaluates to `e^x` Quite useful when doing analysis at University, also preferable over `e^x` because it's way nicer to write `exp(arbitrary expr)` rather than `e^(arbitrary expr)`. --- src/lex.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'src/lex.rs') diff --git a/src/lex.rs b/src/lex.rs index 76f61a0..4bdd7b6 100644 --- a/src/lex.rs +++ b/src/lex.rs @@ -101,6 +101,7 @@ lazy_static! { m.insert("acsc", Function::token_from_fn("acsc".into(), |x| (1./x).asin())); m.insert("asec", Function::token_from_fn("asec".into(), |x| (1./x).acos())); m.insert("acot", Function::token_from_fn("acot".into(), |x| (1./x).atan())); + m.insert("exp", Function::token_from_fn("exp".into(), |x| x.exp())); // single arg function s can be added here m }; -- cgit v1.2.3 From 66790c32e9cc80eed512d67fe3630bbe124c6c61 Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Sun, 26 Dec 2021 14:02:19 +0100 Subject: Add `exp2` function and ensure it's correctly lexed --- src/lex.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'src/lex.rs') diff --git a/src/lex.rs b/src/lex.rs index 4bdd7b6..1c686a1 100644 --- a/src/lex.rs +++ b/src/lex.rs @@ -102,6 +102,7 @@ lazy_static! { m.insert("asec", Function::token_from_fn("asec".into(), |x| (1./x).acos())); m.insert("acot", Function::token_from_fn("acot".into(), |x| (1./x).atan())); m.insert("exp", Function::token_from_fn("exp".into(), |x| x.exp())); + m.insert("exp2", Function::token_from_fn("exp2".into(), |x| x.exp2())); // single arg function s can be added here m }; @@ -135,19 +136,23 @@ pub fn lexer(input: &str, prev_ans: Option) -> Result, CalcError '0'..='9' | '.' => { if !char_vec.is_empty() { if FUNCTIONS.get(&char_vec[..]).is_some() { - return Err(CalcError::Syntax(format!( - "Function '{}' expected parentheses", - char_vec - ))); + char_vec.push(letter); + if !FUNCTIONS.get(&char_vec[..]).is_some() { + return Err(CalcError::Syntax(format!( + "Function '{}' expected parentheses", + &char_vec[..char_vec.chars().count()-1] + ))); + } } else { return Err(CalcError::Syntax(format!( "Unexpected character '{}'", char_vec ))); } + } else { + num_vec.push(letter); + last_char_is_op = false; } - num_vec.push(letter); - last_char_is_op = false; } '_' => { if prev_ans.is_none() { -- cgit v1.2.3 From 18a1ce8f0343f7865f8a01741fb96f98945645d0 Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Sun, 26 Dec 2021 15:41:47 +0100 Subject: Allow expressions such as `e2` as multiplication of `e * 2` --- src/lex.rs | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/lex.rs') diff --git a/src/lex.rs b/src/lex.rs index 1c686a1..da542d5 100644 --- a/src/lex.rs +++ b/src/lex.rs @@ -143,6 +143,12 @@ pub fn lexer(input: &str, prev_ans: Option) -> Result, CalcError &char_vec[..char_vec.chars().count()-1] ))); } + } else if CONSTANTS.get(&char_vec[..]).is_some() { + result.push(CONSTANTS.get(&char_vec[..]).unwrap().clone()); + result.push(OPERATORS.get(&'*').unwrap().clone()); + char_vec.clear(); + num_vec.push(letter); + last_char_is_op = false; } else { return Err(CalcError::Syntax(format!( "Unexpected character '{}'", -- cgit v1.2.3 From a18e994ae5fc95761d4d3569a99d98dd4a99660b Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Sun, 26 Dec 2021 16:01:25 +0100 Subject: Add `round()` function --- src/lex.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'src/lex.rs') diff --git a/src/lex.rs b/src/lex.rs index da542d5..1220a1f 100644 --- a/src/lex.rs +++ b/src/lex.rs @@ -103,6 +103,7 @@ lazy_static! { m.insert("acot", Function::token_from_fn("acot".into(), |x| (1./x).atan())); m.insert("exp", Function::token_from_fn("exp".into(), |x| x.exp())); m.insert("exp2", Function::token_from_fn("exp2".into(), |x| x.exp2())); + m.insert("round", Function::token_from_fn("round".into(), |x| x.round())); // single arg function s can be added here m }; -- cgit v1.2.3