summaryrefslogtreecommitdiffstats
path: root/src/forth/mod.rs
blob: f61bbdac8c9e2912a59aa0d9aa589fce286f5c62 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
pub mod compiler;
pub mod vm;

#[cfg(test)]
mod tests {
    use super::{
        vm::{VM, WordList},
        compiler::Compiler,
    };

    fn compiler_for(text: &str) -> Compiler {
        let mut p = Compiler::new(text);
        p.compile().expect("badparse");
        p
    }

    fn eprintwordlist(wordlist: &WordList) {
        for i in 0..wordlist.0.len() {
            eprintln!("wordlist[{}]: {:?}", i, wordlist.0[i]);
        }
    }

    // recursive!
    #[test]
    fn fac() {
        let prog = ": fac dup 1 > if dup 1 - fac * then ; 5 fac\n";
        let p = compiler_for(prog);
        eprintwordlist(&p.wordlist);
        let mut vm = VM::new(p.wordlist);
        vm.run().expect("should run to completion");
        eprintln!("stack: {:?}", vm.stack);
        assert_eq!(vm.stack.0.len(), 1, "factorial result stack len");
        assert_eq!(vm.stack.0[0], 120, "factorial result value");
    }
}