1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use crate::rail_machine::RailDef;

pub fn builtins() -> Vec<RailDef<'static>> {
    vec![
        RailDef::on_stack("drop", &["a"], &[], |stack| stack.pop().1),
        RailDef::on_stack("dup", &["a"], &["a", "a"], |stack| {
            let (a, stack) = stack.pop();
            stack.push(a.clone()).push(a)
        }),
        RailDef::on_stack("swap", &["b", "a"], &["a", "b"], |stack| {
            let (a, stack) = stack.pop();
            let (b, stack) = stack.pop();
            stack.push(a).push(b)
        }),
        RailDef::on_stack("rot", &["c", "b", "a"], &["a", "c", "b"], |stack| {
            let (a, stack) = stack.pop();
            let (b, stack) = stack.pop();
            let (c, stack) = stack.pop();
            stack.push(a).push(c).push(b)
        }),
    ]
}