#random #c-api #dsl

rvs-c-api

Rvs 的 C-API - 一个使用简单 DSL 定义和评估随机变量的库

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 日

#2119Rust 模式

每月 31 次下载

MIT/Apache

86KB
2K SLoC

Rvs

Crates.io Build Status Codecov LoC Dependency Status

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>)
      • 随机类型
        • Range - 返回指定范围内的随机值(包括端点)。语法:[<lower>, <upper>]
        • 带权或不带权抽样(有放回或无放回)
          • 带权抽样(有放回)。语法:r{<weight>: <expr>, ...}
            • 仅在当前子表达式完成时选择新子表达式
          • 不带权抽样(有放回)。语法:r{<expr>, ...}
            • 仅在当前子表达式完成时选择新子表达式
          • 带权抽样(无放回)。语法:{<weight>: <expr>, ...}
            • 仅在当前子表达式完成时选择新子表达式
          • 不带权抽样(无放回)。语法:{<expr>, ...}
            • 仅在当前子表达式完成时选择新子表达式
      • 其他类型
        • 模式 - 按顺序返回子表达式。语法:Pattern(<expr>, ...) * [x] 仅当当前子表达式完成时选择新子表达式
        • 循环/序列 - 返回一系列数字。语法:Sequence(<count>) OR Sequence(<offset>, <count>) OR 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']
      • 源相关路径,例如在 fileaimport fileb 变为 $(dirname filea)/fileb.rvs
      • 简化命名,例如 path::file 而不是 'path/file.rvs'
    • 错误中的文件名
    • 错误中的行号

其他

  • 优化
  • 拆分成多个crate
    • Rvs 库 - rvs
    • DSL(语法/解析器,AST)- rvs-parser
    • 交互式二进制文件 - rvs-repl
    • C-API - rvs-capi
  • 实现 Iterator 特性
  • 使用已发布的版本 of rand
  • 使用单态化 Rng 而不是 trait 对象。可以是泛型或类型。
  • 将源信息添加到转换错误

依赖项

~2MB
~30K SLoC