16 个稳定版本

2.1.0 2022年2月12日
2.0.0 2022年1月27日
1.7.0 2022年1月27日
0.1.0 2022年1月17日

#3 in #algebraic-expressions

Download history 27/week @ 2024-03-30 6/week @ 2024-04-06

53 下载/月

MIT 许可证

37KB
757

calc_lib

一个用于使用正确运算顺序从输入中评估代数表达式的包。
最初是为了用于基于终端的计算器应用程序而设计的。

特性

  • 基本代数运算
  • 正确的运算顺序(函数始终先于 PEMDAS 进行评估)
  • 可选定义变量
  • 整数运算和浮点运算(任选其一)
  • 如 log、sin、cos、tan 等函数
  • 可选定义函数

计划中的特性

  • 方程验证(例如 2 + 2 = 4 是有效的,而 2 + 2 = 5 则不是)
  • 求解变量(如 x + 2 = 4 将得到 x = 2

可能在未来实现的功能

  • 求解多个变量(例如,3x - y = 72x + y = 8 将得到 x = 3y = 2

默认函数

使用 Functions::default; 访问

  • log(底数,)
  • sqrt()
  • sin()
  • cos()
  • tan()

自定义错误系统

  • 公开了 Error 枚举,允许用户确定发生了哪种类型的错误,并获取有关它的所有相关信息
  • 如果需要,允许用户自行处理错误,也可以直接打印出来。

示例

整数方程

// 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.is_err() {
        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.
    assert_eq!(eval.unwrap() as i32, 7);
}

小数方程

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.is_err() {
        panic!("{}", x.unwrap_err());
    }
    assert_eq!(eval.unwrap(), 9.05);
}

用变量求解

use calc_lib::{evaluate_with_defined, 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);
}

没有运行时依赖