1个不稳定版本
0.1.0 | 2021年3月10日 |
---|
#1036 在 过程宏
56KB
1.5K SLoC
Rerust
尚未发布
这是ReRust的源代码,ReRust是一个功能响应式编程语言(FRP),它为Rust提供数据流编程。
使用方法
要开始使用,请安装Rust工具链,并将以下行添加到您的Cargo.toml
文件中
[dependencies]
rerust = "1.0"
ReRust使用过程宏生成原生Rust代码。每个宏调用应放置在单独的模块中,以避免名称冲突。查看examples/chat.rs
和examples/diamond.rs
以获取一些灵感。
入门
ReRust代码位于过程宏中,以生成可以从纯Rust使用的结构体和函数。宏调用通常如下所示
mod macrodemo {
use rerust::rerust;
rerust! {
let x = Var::<u32>(1u32);
let y = x.map(|x: &u32| -> u32 {x * 2});
let z = x.map(|x: &u32| -> u32 {x * 3});
let pin t = (y,z).map(|y: &u32, z: &u32| -> u32 {y + z});
}
}
之后,您可以像使用您想要的任何程序实例一样使用您的程序。要更新程序状态,您需要检索一个Sink
,它允许使用新值更新响应式。如果状态在两次迭代之间发生变化,所有注册的观察者都会收到通知,这对于更新GUI等非常有用。最后,您需要定期调用Program::run()
来轮询sink并更新状态。将值推送到sink是通过Sink::send_<source_name>(<val>)
完成的。
let mut prog = generated::Program::new();
let mut sink = prog.sink();
// register observer, takes reference of t's type
let observer = Rc::new(RefCell::new(observer_cb)) as Rc<_>;
prog.observe_t(Rc::downgrade(&observer));
// update x value
sink.send_x(2);
// initialize program and call observers with initial values
prog.init();
for _ in 0..5 {
// check for new input, udpate state and notify observers
prog.run();
}
可用原语
- Var/Evt:保留状态供下一次迭代或在一轮评估后失效的源响应式(变量)
- Map:将(多个)响应式映射到新的输出响应式,通过在它们的值上调用提供的闭包。适用于事件和变量。如果至少有一个事件作为输入,Map也将是一个事件响应式。
- Fold:至少接受一个事件和任意数量的变量作为输入,类型为变量。随时间积累值。
- 变更:精确接受一个变量并将其转换为事件,只有当传入的响应式数据发生变化时才会触发。
依赖项
~4.5–6.5MB
~117K SLoC