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 日 |
#978 in Rust 模式
在 2 crate 中使用
75KB
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>]
- 带/不带权重的有/无替换抽样
- 带权重的有替换抽样。语法:
{<weight>: <expr>, ...}
- 仅在当前子表达式完成时选择新的子表达式
- 不带权重的有替换抽样。语法:
r{<expr>, ...}
- 仅在当前子表达式完成时选择新的子表达式
- 带权重的无替换抽样。语法:
{<weight>: <expr>, ...}
- 仅在当前子表达式完成时选择新的子表达式
- 不带权重的无替换抽样。语法:
{<expr>, ...}
- 仅在当前子表达式完成时选择新的子表达式
- 带权重的有替换抽样。语法:
- Range - 返回区间 [,) 内的随机值。语法:
- 其他类型
- Pattern - 按顺序返回子表达式。语法:
Pattern(<expr>, ...)
* [x] 仅在当前子表达式完成时选择新的子表达式 - 循环/序列 - 返回一个数字序列。语法:
Sequence(<count>)
或者Sequence(<offset>, <count>)
或者Sequence(<offset>, <increment>, <count>)
- Pattern - 按顺序返回子表达式。语法:
- 运算符
- 算术运算符
- +, -
- *, /
- %
- 位运算符
- &, |, ^
- <<, >>
- ~
- 运算符的完成性。当两个操作数至少各完成一次指示时完成。
- 算术运算符
- 元类型
- 空白字符
- 注释
- 需要/包含/导入等
- 导入是幂等的
- 搜索路径 - 键值对。例如:'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
特性 - 使用发布的 rand 版本
- 使用单态化的 Rng 而不是特质对象。可以使其泛型或类型。
- 将源信息添加到转换错误
依赖项
~1.5MB
~28K SLoC