diff options
| author | Arnaud Bailly <arnaud.bailly@iohk.io> | 2024-09-25 21:49:33 +0200 |
|---|---|---|
| committer | Arnaud Bailly <arnaud.bailly@iohk.io> | 2024-09-25 21:49:33 +0200 |
| commit | 3ac809d7f8c4f29bfcd0a52c7e168e783abc88df (patch) | |
| tree | 76ed4bbdb97e423593d2cb358906e43e75d19ddd /rust/src/io.rs | |
| parent | 7f83391f3e4f37fbc512fd7d2bb7c7ec2f0858e9 (diff) | |
| download | lambda-nantes-3ac809d7f8c4f29bfcd0a52c7e168e783abc88df.tar.gz | |
Extract IO operations to own module
Diffstat (limited to 'rust/src/io.rs')
| -rw-r--r-- | rust/src/io.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/rust/src/io.rs b/rust/src/io.rs new file mode 100644 index 0000000..33d8c4e --- /dev/null +++ b/rust/src/io.rs @@ -0,0 +1,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(); + } + } +} |
