7个不稳定版本

使用旧的Rust 2015

0.4.3 2018年9月25日
0.4.2 2018年9月25日
0.4.1 2017年6月19日
0.3.0 2017年6月6日
0.1.0 2017年6月2日

#1748 in 算法

24次每月下载

MIT/Apache

36KB
572

Caldyn,数学表达式的动态评估

Build Status codecov crates.io

该crate提供对嵌入在字符串中的数学表达式的运行时评估,包含常量和用户提供的变量。这可以用于在更大的上下文中评估用户提供的表达式。

文档

用法

将crate添加到您的Cargo.toml

[dependencies]
caldyn = "0.4"

使用此crate的最简单方法是使用eval函数

assert_eq!(caldyn::eval("3 + 5 * 2", None), Ok(13.0));

eval的第二个参数是Context,可以定义变量

use caldyn::Context;

let mut context = Context::new();
context.set("a", 3.5);
assert_eq!(caldyn::eval("2 * a", &context), Ok(7.0));

也可以使用Expr类型将表达式的解析和评估分开。这允许使用不同的变量值重用相同的表达式。

use caldyn::{Expr, Context};

let expr = Expr::parse("3 + 5 * 2").unwrap();
assert_eq!(expr.eval(None), Ok(13.0));

let expr = Expr::parse("3 / c + b").unwrap();
let mut context = Context::new();
context.set("c", 1.0);
context.set("b", 5.0);
assert_eq!(expr.eval(&context), Ok(8.0));

context.set("b", 10.0);
assert_eq!(expr.eval(&context), Ok(13.0));

还可以设置一个回调函数,当在上下文中找不到变量时使用

use caldyn::{eval, Context};

let mut context = Context::new();
context.set_query(|name| {
    match name {
        "a" | "b" | "c" => Some(1.0),
        _ => None
    }
});

assert_eq!(eval("a + b", &context), Ok(2.0));
// the following line would error with "undefined variable 'd'" message
// eval("d / 2", &context);

作为终端计算器的用法

您可以使用calc示例作为您的终端计算器,通过cargo安装

cargo install caldyn --example calc

语言定义

caldyn实现的语言可以包含以下元素

  • 浮点字面值:如-12.456+0.0045e78等;
  • 左右括号;
  • 数学运算符:如+表示加法,-表示减法,*表示乘法,/表示除法,^表示指数运算(使用std::f64::powf);
  • 变量。变量名只能是ASCII字符,可以以字母或_开头,可以包含字母、数字、._[]
  • 函数调用:sin(a)atan(22.0)。以下函数均可访问,与对应的 std::f64 函数意义相同:sqrtcbrtsincostanasinacosatansinhcoshtanhasinhacoshatanhfloorceilabsexplnlog2log10

输入中禁止使用任何其他符号。

数学运算符遵循通常的关联性和优先级关系,但仍具有浮点数的特性:加法不是交换律的,存在 NaN 和无穷大...

请注意,虽然 [] 可以在变量名中使用,但不会对它们做任何操作。Caldyn 的用户可以在自己的 [Context::set_query()] 函数中将它们解析为索引运算符。

许可和贡献

Caldyn 由 Guillaume Fraux 编写,并可选择在 MIT 或 Apache 许可证下分发。欢迎贡献,请在讨论您的更改之前打开一个问题!

依赖关系

~10KB