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 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 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}