1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2017年11月11日 |
---|
#1570 在 数学
被用于 simple_jazz
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
- 例如
-
自定义/选项
- 可能通过位标志
- 例如允许哪些运算符,是否允许定义变量等...
-
内置函数
- 例如
π
,e
,sin(θ)
- 回到上一个问题:内置函数应该是可选的
- 例如
-
一行中包含多个表达式
- 例如
5 + {1, 2, 3}
→6
、7
和8
- 它们可能被返回在一个哈希集中。
- 例如
-
符号表达式
- 例如
'x = a + b'
(可能使用不同的分隔符) - 可以是方程(即带有等号),或者仅仅是简单的表达式
where
子句- 例如
'a + b' where a = 2, b = 10
→12
- 例如
求解... 对于
- 例如
solve 'a = x + b' for x
→'x = a - b'
- 例如
(solve 'a = x + b' for x) where a = 5, b = 2
→3
- 例如
solve 'x^2 + 3x + 2' for x
→(x + 1)(x + 2)
- 例如
- 甚至可能是积分/微分
- 例如