repl/
repl.rs

1extern crate nock;
2
3use std::default::Default;
4use std::io::{self, BufRead, Write};
5use nock::{Nock, Noun};
6
7struct VM;
8impl Nock for VM {}
9
10fn main() {
11    let mut subject: Noun = Default::default();
12    // Default to identity formula.
13    let mut formula = Noun::cell(Noun::from(0u32), Noun::from(1u32));
14    let mut vm = VM;
15
16    println!("Welcome to nock-rs");
17    println!("Type a formula to nock on the subject");
18    loop {
19        let mut input = String::new();
20
21        println!("{}", &subject);
22        print!("> ");
23        io::stdout().flush().expect("IO error");
24        match io::stdin().read_line(&mut input) {
25            Ok(_) => {
26                if input == "\n" {
27                    // Reuse previous valid formula on empty input.
28                    match vm.nock_on(subject.clone(), formula.clone()) {
29                        Ok(eval) => {
30                            subject = eval;
31                        }
32                        Err(_) => println!("Nock eval error"),
33                    }
34                } else {
35                    match input.parse::<nock::Noun>() {
36                        Ok(f) => {
37                            match vm.nock_on(subject.clone(), f.clone()) {
38                                Ok(eval) => {
39                                    subject = eval;
40                                    formula = f;
41                                }
42                                Err(_) => println!("Nock eval error"),
43                            }
44                        }
45                        _ => println!("Not a Nock formula"),
46                    }
47                }
48            }
49
50            Err(_) => break,
51        }
52    }
53}