#变量 #顺序 #减少 #cad #概念 #约束 #尝试

constrainer

尝试将CAD约束概念引入变量中,以显著减少冗余指令。

2个版本

0.0.2 2021年11月28日
0.0.1 2021年11月28日

#41#约束


2 个crate中使用 (通过 bui)

MIT 许可证

27KB
473

Rust Crates.io Docs

Constrainer

尝试将CAD约束概念引入变量中,以显著减少冗余指令。

用法

create_constrainer! 创建一个结构体,作为约束变量的“约束”环境的基体。第一个单词(Ident)是约束结构体的名称。这可以是任何有效的结构体名称。紧随其后,放置括号以分隔传递给编译器(proc_macro2)以创建约束结构体的数据(proc_macro2)。在括号内,您可以定义动态变量和约束变量以及这些变量可以进行的操作。

动态变量的定义如下:dynamic name type

约束变量的定义如下:constrained name type (args) { set fn body }

可以通过在约束实例上调用 .get_{name} 来检索变量;

约束也可以依赖于其他约束。请确保按照依赖顺序执行。默认情况下,所有操作都将按照它们定义的顺序线性执行。

监听器的定义如下:listener name (args) { listener fn body }。当其参数中的变量更新或初始化时,将调用监听器。

注意:目前不支持引用当前作用域之外的类型 std::f32不会 工作。此功能可能在未来的版本中实现。

注意2:当前逗号被忽略。请不要依赖这一点。在未来版本中它们将变为强制要求。

注意3:尚未完成。

create_constrainer! 示例

use constrained::create_constrainer;

fn compute_y(x: f32) -> f32 {
    x*10.0-1.0
}

create_constrainer!(MyConstrainer {
    dynamic x f32
    constrained y f32 (x) {
        compute_y(x)
    }
    constrained z f32 (x, y) {
        x*y
    }
});

fn main() {
    let constrainer_instance = MyConstrainer::new(2.0);
    let y = constrainer_instance.get_y();
    let z = constrainer_instance.get_z();
    assert_eq!(*y, compute_y(2.0));
    assert_eq!(*z, y*2.0);
}

依赖关系

~2.5MB
~51K SLoC