calc_lib

A crate for evaluating algebraic expressions from input using correct order of operations.\ This was designed originally for use in terminal based calculator apps.

Features

Planned Features

Features that may be implemented in the future

Default functions

accessed with Functions::default(); * log(base, value) * sqrt(value) * sin(value) * cos(value) * tan(value)

Custom Error system:

Examples:

Integer equations: ```rust // evaluates an algebraic equation use calc_lib::evaluate;

fn main() { // the equation to evaluate let eval = evaluate("1 + 2 * 3"); // print out errors if they occur, or handle them another way if eval.iserr() { panic!("{}", eval.err().unwrap()); } // the result is a f64, which can then be used as needed // here, I am just asserting that it is the value it should be. asserteq!(eval.unwrap() as i32, 7); } Decimal Equations: rust use calc_lib::evaluate;

fn main() { // define the expression let expression = "1.3 + 2.5 * 3.1"; // evaluate the expression let eval = evaluate(expression); // handle errors that may occur if eval.iserr() { panic!("{}", x.unwraperr()); } asserteq!(eval.unwrap(), 9.05); } Solving with variables: rust use calclib::{evaluatewithdefined, Definitions, Functions, Error};

fn main() { // define x as 16 let mut defs = Definitions::new(); defs.register("x", 16);

// create the functions list
// this defines an empty Functions struct with no functions.
// for functions like log, sqrt, sin, cos, tan, etc., use `Functions::default()`
let mut funcs = Functions::new();
// this shows the definition of the log function,
// exactly how it is implemented in `Functions::default();`
funcs.register("log", |args| {
    // args is of type Vec<f64>
    // this takes 2 arguments: base, number
    if args.len() != 2 {
        return Err(Error::arg_count("log", 2, args.len()));
    }
    // return the value
    Ok(args[1].log(args[0]))
});
// evaluate the expression and verify the results
let eval = evaluate_with_defined("log(2, x)", Some(&defs), Some(&funcs));
if eval.is_err() { 
  panic!("{}", eval.unwrap_err());
}
assert_eq!(eval.unwrap(), 4.0);

} ```