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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
use std::{
fs::read_to_string,
io::{BufRead, BufReader, Read, Write},
};
use crate::{
ast::Value,
lambda::{eval_all, eval_whnf, 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 batch_eval<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();
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_whnf(v, &mut env))
.collect::<Vec<Value>>();
for result in results {
writeln!(outp, "{}", result).unwrap();
outp.flush().unwrap();
}
}
}
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_whnf(v, &mut env))
.collect::<Vec<Value>>();
for result in results {
writeln!(outp, "{}", result).unwrap();
outp.flush().unwrap();
}
}
}
|