13 个稳定版本
2.5.0 | 2024年8月5日 |
---|---|
2.4.1 | 2024年8月5日 |
2.2.2 | 2024年7月31日 |
1.0.2 | 2024年7月16日 |
220 在 算法 中
1,464 每月下载量
57KB
1.5K SLoC
SML - ShakeMyLeg,这是一个状态机语言吗?
一个简单的状态机定义语言和解释器。
状态机由状态组成 - 机器运行直到满足退出条件并移动到下一阶段。在 shakemyleg
中的状态机定义为每次机器运行时运行的表达式序列 - "头部"。与头部一起的是主体 - 一系列条件,当评估为 true
时,运行一系列表达式和一个 StateOp
(changeto <state>
、stay
、end
)。如果没有条件为真,则不采取任何操作。条件按顺序访问。注释从 #
开始。
一个简单的 shakemyleg
机器示例
# flip_flip.sml
state A:
always:
outputs.bar = inputs.bar + 1
changeto B
state B:
always:
outputs.bar = inputs.bar + 1
changeto A
(操作符和括号周围需要大量空格,因为编译器很傻。) 此机器在状态 A 和 B 之间交替,并将值 bar
从输入对象传播到输出,并递增它。
我们可以“编译”并运行它
use shakemyleg::compile;
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct Foo {
bar: u8
}
let src = r#"
state A:
always:
outputs.bar = inputs.bar + 1
changeto B
state B:
always:
outputs.bar = inputs.bar + 1
changeto A
"#;
let mut machine = compile(src).unwrap();
let i = Foo { bar: 0 };
let o: Foo = machine.run(i).unwrap().unwrap();
// Two unwraps as the rv is Result<Option<Foo>>
// Result<...> checks if any errors occurred while running
// Option<...> checks if the machine is still running
// output.bar is incremented every time the machine is run
if o.bar != 1u8 {
panic!();
}
依赖项
~3.5–5.5MB
~100K SLoC