summaryrefslogtreecommitdiff
path: root/rust/src/io.rs
blob: 33d8c4e992c1e2c1fc87d2b378bef8e2758c759b (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
36
37
38
39
40
41
42
43
44
45
46
47
use std::{
    fs::read_to_string,
    io::{BufRead, BufReader, Read, Write},
};

use crate::{
    ast::Value,
    lambda::{eval, eval_all, Environment},
    parser::parse,
};

pub fn eval_file(file_name: &str) -> String {
    let content = read_to_string(file_name).unwrap();
    let values = parse(&content.to_string());
    eval_all(&values)
        .iter()
        .map(|v| v.to_string())
        .collect::<Vec<String>>()
        .join(" ")
}

pub fn repl<I: Read, O: Write>(inp: &mut I, outp: &mut O) {
    let mut env = Environment::new();
    let mut reader = BufReader::new(inp);
    loop {
        let mut input = String::new();
        write!(outp, "> ").unwrap();
        outp.flush().unwrap();
        match reader.read_line(&mut input) {
            Ok(0) => break,
            Ok(_) => (),
            Err(e) => {
                writeln!(outp, "{}", e).unwrap();
                break;
            }
        }
        let values = parse(&input);
        let results = values
            .iter()
            .map(|v| eval(v, &mut env))
            .collect::<Vec<Value>>();
        for result in results {
            writeln!(outp, "{}", result).unwrap();
            outp.flush().unwrap();
        }
    }
}