2个版本
0.0.2 | 2021年11月28日 |
---|---|
0.0.1 | 2021年11月28日 |
#41 在 #约束
在 2 个crate中使用 (通过 bui)
27KB
473 行
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