5 个版本 (3 个重大更改)
| 0.5.0 | 2020 年 11 月 26 日 |
|---|---|
| 0.4.1 | 2018 年 3 月 19 日 |
| 0.4.0 | 2018 年 3 月 18 日 |
| 0.3.0 | 2018 年 2 月 1 日 |
| 0.2.0 | 2018 年 1 月 8 日 |
#2119 在 Rust 模式
每月 31 次下载
86KB
2K SLoC
Rvs
Rvs 是一个使用简单 DSL 定义和评估随机变量的 C API 库。
示例
// An enumeration defintion with implicit value members.
enum Command {
Read,
Write,
Erase,
}
// A variable that yields the repeating pattern: 2, 0, 1, 0
pattern = Pattern(
Command::Erase,
Command::Read,
Command::Write,
Command::Read,
);
// A variable that yields random values in the range [0, 7] inclusive
range = [0, 7];
// A variable that yields random values in the set {0, 1, 2}. Yielded values
// are added back to the set.
sample_with_replacement = r{
Command::Read,
Command::Write,
Command::Erase,
};
// A variable that yields random values in the set {0, 1, 2}. Yielded values
// are removed from the set. After all values have been yielded, the set is
// repopulated.
sample_without_replacement = {
Command::Read,
Command::Write,
Command::Erase,
};
// A variable that yields weighted random values `0` 40% of the time, `1` 50%
// of the time, and `2` 10% of the time.
weighted_sample_with_replacement = r{
40: Command::Read,
50: Command::Write,
10: Command::Erase,
};
// A variable that randomly yields values from a pool of 40 `0`s, 50 `1`s, and
// 10 `2`s. Yielded values are removed from the pool. The pool is
// re-populated after all values have been yielded.
weighted_sample_without_replacement = {
40: Command::Read,
50: Command::Write,
10: Command::Erase,
};
许可证
许可协议为以下之一
任选其一。
贡献
除非您明确说明,否则根据 Apache-2.0 许可协议定义的,您有意提交的任何贡献,均应按照上述方式双许可,而无需任何额外条款或条件。
功能状态
-
表达式功能
-
下一页() -
上一页() -
完成() -
重置() -
显示
-
-
从字符串解析
- 从文件解析
- 解析错误报告
- 覆盖现有变量定义
-
C API
-
rvs_context_new() -
rvs_context_free() -
rvs_seed() -
rvs_parse() -
rvs_get() -
rvs_next() -
rvs_done() -
rvs_prev() -
rvs_reset() -
rvs_write_definitions()
-
-
语法
- 构造
- 变量
- 枚举
- 隐式值 例如
enum Enum { Value, } - 显式值 例如
enum Enum { Value = 0, } - 枚举成员的使用 例如
enum Enum { Value = 0, } a = Enum::Value展开为a = 0 - 使用枚举类型。例如:
enum Enum { Value0, Value1, } a = Sample(Enum)转换为a = Sample(0, 1)
- 隐式值 例如
- 结构体
- 类型
- 元类型
- Next - 返回变量的下一个值。语法:
<identifier> - Copy - 返回变量的副本。语法:
<identifier>.copy - Prev - 返回变量的上一个值。语法:
<identifier>.prev - Done - 强制子表达式在每次迭代时都指示完成。语法:
<expr>.done - Once - 强制子表达式只评估一次。语法:
<expr>.once - Expand - 返回直到完成的所有表达式评估。语法:
Expand(<expr>)或Expand(<expr>, <count-expr>)
- Next - 返回变量的下一个值。语法:
- 随机类型
- Range - 返回指定范围内的随机值(包括端点)。语法:
[<lower>, <upper>] - 带权或不带权抽样(有放回或无放回)
- 带权抽样(有放回)。语法:
r{<weight>: <expr>, ...}- 仅在当前子表达式完成时选择新子表达式
- 不带权抽样(有放回)。语法:
r{<expr>, ...}- 仅在当前子表达式完成时选择新子表达式
- 带权抽样(无放回)。语法:
{<weight>: <expr>, ...}- 仅在当前子表达式完成时选择新子表达式
- 不带权抽样(无放回)。语法:
{<expr>, ...}- 仅在当前子表达式完成时选择新子表达式
- 带权抽样(有放回)。语法:
- Range - 返回指定范围内的随机值(包括端点)。语法:
- 其他类型
- 模式 - 按顺序返回子表达式。语法:
Pattern(<expr>, ...)* [x] 仅当当前子表达式完成时选择新子表达式 - 循环/序列 - 返回一系列数字。语法:
Sequence(<count>)ORSequence(<offset>, <count>)ORSequence(<offset>, <increment>, <count>)
- 模式 - 按顺序返回子表达式。语法:
- 运算符
- 算术运算符
- +, -
- *, /
- %
- 位运算符
- &, |, ^
- <<, >>
- ~
- 运算符的完成度。当两个操作数都至少完成一次指示时完成。
- 算术运算符
- 元类型
- 空白字符
- 注释
- 需要/包含/导入等
- 导入是幂等的
- 搜索路径 - 键值对,例如 'key0=/a/b/c:key1=/d/e/f'。
- 键相关路径,例如
::key0::path::file => '/a/b/c/path/file.rvs' - 优先级路径,例如
path::file=> ['/a/b/c/path/file.rvs', '/d/e/f/path/file.rvs']
- 键相关路径,例如
- 源相关路径,例如在
filea中import fileb变为$(dirname filea)/fileb.rvs - 简化命名,例如
path::file而不是'path/file.rvs'
- 错误中的文件名
- 错误中的行号
- 构造
其他
- 优化
- 将
HashMap<String, Box<Expr>>转换为HashMap<&str, Box<Expr>> - 用
rand::distributions::Range::new_inclusive()替换RangeInclusive
- 将
- 拆分成多个crate
- Rvs 库 - rvs
- DSL(语法/解析器,AST)- rvs-parser
- 交互式二进制文件 - rvs-repl
- C-API - rvs-capi
- 实现
Iterator特性 - 使用已发布的版本 of rand
- 使用单态化 Rng 而不是 trait 对象。可以是泛型或类型。
- 将源信息添加到转换错误
依赖项
~2MB
~30K SLoC