4个版本 (2个破坏性更新)

0.3.0 2021年5月24日
0.2.0 2020年12月5日
0.2.0-beta.12020年10月4日
0.1.0 2020年6月1日

#975 in 编程语言

MIT/Apache

490KB
11K SLoC

简单的算术解释器

Build Status License: MIT OR Apache-2.0 rust 1.44+ required

链接: docs.rs上的文档 crate文档(master) 变更日志

此库提供了一个简单的解释器,可用于解析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);

有关更多示例,请参阅示例

参见

许可证

根据您的选择,在Apache License,版本2.0MIT许可证下获得许可。

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交给arithmetic-eval的贡献将双重授权,如上所述,没有任何附加条款或条件。

依赖项

~4.5MB
~90K SLoC