21个版本
0.8.8 | 2019年6月20日 |
---|---|
0.8.7 | 2019年3月6日 |
0.8.5 | 2019年2月18日 |
0.8.3 | 2018年5月10日 |
在 解析器实现 中排名第2574
38KB
953 行
asciimath-rs
示例使用
use asciimath::{eval, scope, CustomFn};
let my_sum: CustomFn = |args| Ok(args.iter().sum());
let scope = scope!{
"x" => -1,
"my_sum" => my_sum,
};
assert_eq!(Ok(260.0), eval("my_sum(1, ((1 - x) ^ 2 ^ 3), 3)", &scope));
功能
- 评估
- 隐式乘法
- 支持变量,包括单字母和单词变量
- 易于定义的自定义函数
- 编译表达式并使用不同的变量集进行评估
- f64输出
- 内置的基本函数和常量
高级目标
易用性
这意味着,例如,向表达式传递变量和定义自定义函数,必须能够通过最小了解此库的内部结构和抽象来实现。错误必须是帮助性和相关的。
极简主义
仅关注数学表达式将使此库保持简洁,并能够提供卓越的人机工程学。
准确性
广泛的测试和最大精度必须成为所有模块的一部分,以防止错误并确保一致性。
未来
以下项目将在稳定后考虑
- 非数学表达式,如字符串
- 更多运算符(例如,三元运算符 ? :)
- 简化表达式的功能
- 导数,包括二阶和三阶
- 积分
- 偏微分
- 向量微积分
- 矩阵和向量空间
动机
虽然存在一些旨在实现类似目标的优秀库,但它们不会给我带来如此丰富且有益的Rust学习体验,而且在我看来,它们在人机工程学方面严重不足。
实现
解析器基于Dijkstra的“转换场”算法,将中缀表达式转换为后缀表达式。然而,我们不是将中缀表达式转换为后缀字符串,而是将表达式直接解析为抽象语法树。
依赖关系
~10KB