1个不稳定版本

0.1.0 2021年3月10日

#1036过程宏

Apache-2.0

56KB
1.5K SLoC

Rerust

尚未发布

这是ReRust的源代码,ReRust是一个功能响应式编程语言(FRP),它为Rust提供数据流编程。

使用方法

要开始使用,请安装Rust工具链,并将以下行添加到您的Cargo.toml文件中

[dependencies]
rerust = "1.0"

ReRust使用过程宏生成原生Rust代码。每个宏调用应放置在单独的模块中,以避免名称冲突。查看examples/chat.rsexamples/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