From 7752d73216578d5961751b5d0535088d384b4aa6 Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Sat, 25 Jan 2025 10:45:41 +0100 Subject: Move λ-calcul workshop code to subdirectory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lambda-calcul/rust/src/io.rs | 73 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 lambda-calcul/rust/src/io.rs (limited to 'lambda-calcul/rust/src/io.rs') diff --git a/lambda-calcul/rust/src/io.rs b/lambda-calcul/rust/src/io.rs new file mode 100644 index 0000000..8c628ba --- /dev/null +++ b/lambda-calcul/rust/src/io.rs @@ -0,0 +1,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::>() + .join(" ") +} + +pub fn batch_eval(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::>(); + for result in results { + writeln!(outp, "{}", result).unwrap(); + outp.flush().unwrap(); + } + } +} + +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_whnf(v, &mut env)) + .collect::>(); + for result in results { + writeln!(outp, "{}", result).unwrap(); + outp.flush().unwrap(); + } + } +} -- cgit v1.2.3