| 1.0.0 |  | 
|---|
#10 in #binary-operator
130KB
 2.5K  SLoC
Numcore:一个数学解释器和评估器
Numcore 允许您轻松地将字符串解析为数学表达式并评估它们。
Numcore 是 Numerus 的一部分。
特性
- 二元和一元运算符
- 支持多种值类型- Bool,
- Int,
- Float,
- Complex,
- Vector
 
- 内置函数
- 内置常量
- 用户定义函数: f(x,y) = xsin(y)+ysin(x)
- 用户定义变量: a = pi/2或b = a+2
- 使用 宏 定义您自己的函数。
- 理解 模糊语法,如: g(x) = pisinx
- 递归: f(x) = branch(x<=2, 1, f(x-1)+f(x-2))
- 支持 Serde
- 无 panic
未来版本将实现更多功能!
使用指南
评估 简单的静态表达式
use numcore::*;
assert_eq!(eval("2+2").unwrap(), Value::from(4));
assert_eq!(eval("sin(pi)").unwrap(), Value::from(0));
assert_eq!(eval("re(10+3i)").unwrap(), Value::from(10));
使用 上下文
use numcore::*;
let mut context = Context::default();
// Declaring a function
let res = eval_with_mutable_context(
    "f(x) = branch(x<=2, 1, f(x-1) + f(x-2))",
    &mut context
).unwrap();
// Result is None
assert_eq!(res, None);
// Calling the function. We could just use eval_with_static_context at this point
let res = eval_with_mutable_context("f(10)", &mut context).unwrap();
assert_eq!(res, Some(Value::from(55)));
值
值 包含在 Value 枚举 中,它提供了用于访问包含数据的实用函数
use numcore::Value;
let value = Value::Float(1.0);
assert_eq!(value.as_bool().unwrap(), true);
assert_eq!(value.as_int().unwrap(), 1);
assert_eq!(value.as_float().unwrap(), 1.0);
assert_eq!(value.as_complex().unwrap(), num::complex::Complex::new(1.0, 0.0));
assert_eq!(value.as_vector(), vec![Value::Float(1.0)]);
// Assign type implicitly:
let implicit = Value::from(1.0);
assert_eq!(value, implicit);
请注意,尽管初始值是一个浮点数,但它已经被转换为整型和布尔型。这是可能的,因为该值没有小数部分,并且是一个整数。如果这些条件不满足,转换将失败。
运算符
二元运算符
| 运算符 | 描述 | 优先级 | 
|---|---|---|
| ^ | 指数运算 | 90 | 
| / | 除法 | 70 | 
| * | 乘法 | 70 | 
| % | 取模 | 70 | 
| + | 加法 | 60 | 
| - | 减法 | 60 | 
| < | 小于 | 50 | 
| > | 大于 | 50 | 
| <= | 小于等于 | 50 | 
| >= | 大于等于 | 50 | 
| == | 等于 | 40 | 
| != | 不等于 | 40 | 
| && | 逻辑与 | 30 | 
| || | 逻辑或 | 20 | 
| , | 聚合。创建向量 | 10 | 
| = | 赋值。用于函数和变量声明 | 0 | 
一元运算符
| 运算符 | 描述 | 优先级 | 
|---|---|---|
| ! | 逻辑非 | 80 | 
| - | 否定 | 60 | 
函数
| 函数 | 参数数量 | 描述 | 
|---|---|---|
| min | >=1 | 返回最小值。 | 
| max | >=1 | 返回最大值。 | 
| floor | 1 | 返回最大的整数。 | 
| ceil | 1 | 返回最小的整数。 | 
| round | 1 | 返回四舍五入的整数。 | 
| ln | 1 | 返回数的自然对数。 | 
| log | 2 (基数,参数) | 返回指定基数的数的对数。 | 
| exp | 1 | 返回 e^(参数)。 | 
| rand | 2 (最小值,最大值) | 返回两个指定数之间的随机浮点数。 | 
| branch | 3 (条件,真,假) | 如果条件为真,则返回第二个参数,如果为假,则返回第三个参数。 | 
| sin | 1 | 返回角度的正弦值。 | 
| cos | 1 | 返回角度的余弦值。 | 
| tan | 1 | 返回角度的正切值。 | 
| asin | 1 | 返回角度的反正弦值。 | 
| acos | 1 | 返回角度的反余弦值。 | 
| atan | 1 | 返回角度的反正切值。 | 
| sinh | 1 | 返回角度的双曲正弦值。 | 
| cosh | 1 | 返回角度的双曲余弦值。 | 
| tanh | 1 | 返回角度的双曲正切值。 | 
| asinh | 1 | 返回角度的双曲反正弦值。 | 
| acosh | 1 | 返回角度的双曲反余弦值。 | 
| atanh | 1 | 返回角度的双曲反正切值。 | 
| re | 1 | 返回数的自然部分。 | 
| im | 1 | 返回数的虚部。 | 
| polar | 1 | 返回复数的极坐标形式 (r, theta)。 | 
| arg | 1 | 返回数的正则幅角。 | 
| norm | 1 | 返回向量 (re, im) 的长度。 | 
上下文
上下文 允许您跟踪 用户定义函数 和 变量,以及设置。它们可以按如下方式创建
use numcore::*;
let mut my_context = Context::new(settings::Rounding::Round(8));
Serde
您可以使用可选功能 serde_support 允许所有公共结构体推导 Serialize 和 Deserialize。
[dependencies]
num = { version = "<version>", features = [ "serde_support" ] }
许可证和贡献
与 Numerus 不同,Numcore 采用 MIT 许可证。
Numcore 目前正在积极开发中,但您可以自由地提出问题或拉取请求,以解决您遇到的问题或提出想法。
重要:在存档文件后,使用 npm run commit 命令进行提交,然后按照提示进行操作。使用所有 小写 和 命令式 描述。这确保所有提交都遵循相同的格式,并有助于保持干净的提交历史。
依赖关系
~2MB
~38K SLoC