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::>() .join(" ") } pub fn repl(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::>(); for result in results { writeln!(outp, "{}", result).unwrap(); outp.flush().unwrap(); } } }