5个版本 (破坏性更新)
0.5.0 | 2020年11月26日 |
---|---|
0.4.0 | 2018年3月18日 |
0.3.0 | 2018年2月1日 |
0.2.0 | 2018年1月8日 |
0.1.0 | 2017年12月27日 |
#2586 in Rust模式
在 3 个crate中使用(通过 rvs)
24KB
574 行
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(<expr>, ...)
* [x] 仅当当前子表达式完成时选择新的子表达式 - 循环/序列 - 返回一个数字序列。语法:
Sequence(<count>)
或Sequence(<offset>, <count>)
或Sequence(<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
特性 - 使用已发布的 rand 版本
- 使用单态化 Rng 而不是特例对象。可以使其泛型或为一个类型。
- 将源信息添加到转换错误中
依赖项
~150KB