#random #dsl #c-api

rvs

一个用于使用简单 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 日

#978 in Rust 模式


2 crate 中使用

MIT/Apache

75KB
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>]
        • 带/不带权重的有/无替换抽样
          • 带权重的有替换抽样。语法:{<weight>: <expr>, ...}
            • 仅在当前子表达式完成时选择新的子表达式
          • 不带权重的有替换抽样。语法:r{<expr>, ...}
            • 仅在当前子表达式完成时选择新的子表达式
          • 带权重的无替换抽样。语法:{<weight>: <expr>, ...}
            • 仅在当前子表达式完成时选择新的子表达式
          • 不带权重的无替换抽样。语法:{<expr>, ...}
            • 仅在当前子表达式完成时选择新的子表达式
      • 其他类型
        • Pattern - 按顺序返回子表达式。语法: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'
    • 错误中的文件名
    • 错误中的行号

其他

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

依赖项

~1.5MB
~28K SLoC