1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017年11月11日

#1570数学


被用于 simple_jazz

MIT 许可证

17KB
431

mex 是一个简单的数学表达式解析/评估器,没有任何依赖。目前,它只支持很少的语法。以下是一些有效的表达式

>> 10
10

>> 10 - 3 * 10
-20

>> π = 3.1415926536
3.1415926536

>> 5 * π
15.707963268

目前就这些了。

它支持以下运算符:+-*/=

但是很容易添加更多(通过编辑源代码)。

该包可以用作二进制或库。二进制是一个交互式解释器(REPL),你逐行输入单个表达式,然后得到返回的结果。以下是库的一个示例

use mex::parser;
use mex::evaluator;
use mex::evaluator::context;
use mex::evaluator::object;

fn main() {
    let input = "2 * x";
    let mut parse = parser::Parser::new(input);

    let mut context = context::Context::new();
    context.set(&String::from("x"), object::Object::Number(13.5));

    match parse.parse() {
        Ok(node) => {
            match evaluator::eval_node_in(node, &mut context) {
                Ok(result) => println!("{}", result),
                Err(err) => println!("eval error: {:?}", err),
            }
        }

        Err(e) => println!("parse error: {:?}", e),
    };
}

将来,我希望添加以下功能

  • 简单的 API 用于简单用途

    • 例如 mex::evaluate("1 + 2")3
  • 函数

    • 例如 f(x, y) = x + y
    • 例如 f(2, 3)5
  • 自定义/选项

    • 可能通过位标志
    • 例如允许哪些运算符,是否允许定义变量等...
  • 内置函数

    • 例如 πesin(θ)
    • 回到上一个问题:内置函数应该是可选的
  • 一行中包含多个表达式

    • 例如 5 + {1, 2, 3}678
    • 它们可能被返回在一个哈希集中。
  • 符号表达式

    • 例如 'x = a + b'(可能使用不同的分隔符)
    • 可以是方程(即带有等号),或者仅仅是简单的表达式
    • where 子句
      • 例如 'a + b' where a = 2, b = 1012
    • 求解... 对于
      • 例如 solve 'a = x + b' for x'x = a - b'
      • 例如 (solve 'a = x + b' for x) where a = 5, b = 23
      • 例如 solve 'x^2 + 3x + 2' for x(x + 1)(x + 2)
    • 甚至可能是积分/微分

无运行时依赖