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