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

MIT许可证

38KB
953

Crates.io CI

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