4个版本 (2个破坏性更新)
0.3.0 | 2021年5月24日 |
---|---|
0.2.0 | 2020年12月5日 |
0.2.0-beta.1 | 2020年10月4日 |
0.1.0 | 2020年6月1日 |
#975 in 编程语言
490KB
11K SLoC
简单的算术解释器
此库提供了一个简单的解释器,可用于解析arithmetic-parser
识别的一些语法,例如整数、实数、复数值和模运算(支持内置整数类型和num-bigint
中的大整数)。解释器提供了对原生函数的支持,这可以克服一些语法限制(例如,可以使用原生 if
/ loop
函数来解决控制流的缺乏)。原生函数和不可见引用类型允许将解释器有效地嵌入到更大的Rust应用程序中。
解释器在如何解释语言特性方面有些主观(例如,在元组/对象参数的算术运算方面)。另一方面,处理原始类型是完全可定制的,就像在 arithmetic-parser
中的解析一样。主要目标是使简单的语法(如上述实数值算术)直观。
解释器相当慢——比原生算术慢1-2个数量级。
用法
将此添加到您的 Crate.toml
[dependencies]
arithmetic-eval = "0.3.0"
脚本示例
完全依赖标准函数的简单脚本。
minmax = |xs| xs.fold(#{ min: INF, max: -INF }, |acc, x| #{
min: if(x < acc.min, x, acc.min),
max: if(x > acc.max, x, acc.max),
});
assert_eq((3, 7, 2, 4).minmax().min, 2);
assert_eq((5, -4, 6, 9, 1).minmax(), #{ min: -4, max: 9 });
递归快速排序实现
quick_sort = |xs, quick_sort| {
// We need to pass a function as an arg since the top-level fn
// is undefined at this point.
if(xs == (), || (), || {
(pivot, ...rest) = xs;
lesser_part = rest.filter(|x| x < pivot).quick_sort(quick_sort);
greater_part = rest.filter(|x| x >= pivot).quick_sort(quick_sort);
lesser_part.push(pivot).merge(greater_part)
})()
};
// Shortcut to get rid of an awkward fn signature.
sort = |xs| xs.quick_sort(quick_sort);
assert_eq((1, 7, -3, 2, -1, 4, 2).sort(), (-3, -1, 1, 2, 2, 4, 7));
// Generate a larger array to sort. `rand_num` is a custom native function
// that generates random numbers in the specified range.
xs = array(1000, |_| rand_num(0, 100)).sort();
// Check that elements in `xs` are monotonically non-decreasing.
{ sorted } = xs.fold(
#{ prev: -1, sorted: true },
|{ prev, sorted }, x| #{
prev: x,
sorted: sorted && prev <= x
},
);
assert(sorted);
有关更多示例,请参阅示例。
参见
arithmetic-typing
是为此crate评估的AST的类型检查/推理工具。
许可证
根据您的选择,在Apache License,版本2.0或MIT许可证下获得许可。
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交给arithmetic-eval
的贡献将双重授权,如上所述,没有任何附加条款或条件。
依赖项
~4.5MB
~90K SLoC