diff options
| author | Arnaud Bailly <arnaud.bailly@iohk.io> | 2024-09-25 14:37:06 +0200 |
|---|---|---|
| committer | Arnaud Bailly <arnaud.bailly@iohk.io> | 2024-09-25 14:37:06 +0200 |
| commit | 0fed41e6afbf32d274660cc3ec435686901d12c4 (patch) | |
| tree | a126f10db0e439ff8c55df8b78652e47d3f63486 /rust/src/lambda.rs | |
| parent | 778881eda5b0955fb4c845fb29097f048491f007 (diff) | |
| download | lambda-nantes-0fed41e6afbf32d274660cc3ec435686901d12c4.tar.gz | |
Introduce basic REPL
Diffstat (limited to 'rust/src/lambda.rs')
| -rw-r--r-- | rust/src/lambda.rs | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/rust/src/lambda.rs b/rust/src/lambda.rs index 97b6f08..416c31e 100644 --- a/rust/src/lambda.rs +++ b/rust/src/lambda.rs @@ -1,5 +1,9 @@ use rand::Rng; -use std::{collections::HashMap, fs::read_to_string}; +use std::{ + collections::HashMap, + fs::read_to_string, + io::{BufRead, BufReader, Read, Write}, +}; mod ast; use ast::*; @@ -58,6 +62,33 @@ pub fn eval_file(file_name: &str) -> 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(); + } + } +} + fn eval_all(values: &[Value]) -> Vec<Value> { let mut env = Environment::new(); values.iter().map(|v| eval(v, &mut env)).collect() |
