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次每月下载
36KB
572 行
Caldyn,数学表达式的动态评估
该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函数意义相同:sqrt,cbrt,sin,cos,tan,asin,acos,atan,sinh,cosh,tanh,asinh,acosh,atanh,floor,ceil,abs,exp,ln,log2,log10。
输入中禁止使用任何其他符号。
数学运算符遵循通常的关联性和优先级关系,但仍具有浮点数的特性:加法不是交换律的,存在 NaN 和无穷大...
请注意,虽然 [ 和 ] 可以在变量名中使用,但不会对它们做任何操作。Caldyn 的用户可以在自己的 [Context::set_query()] 函数中将它们解析为索引运算符。
许可和贡献
Caldyn 由 Guillaume Fraux 编写,并可选择在 MIT 或 Apache 许可证下分发。欢迎贡献,请在讨论您的更改之前打开一个问题!
依赖关系
~10KB