2024-05-05 12:36:57 +00:00
|
|
|
use rustyline::{error::ReadlineError, DefaultEditor};
|
2023-09-12 11:21:51 +00:00
|
|
|
|
2024-05-04 20:40:02 +00:00
|
|
|
mod env;
|
|
|
|
mod error;
|
2023-09-19 14:15:40 +00:00
|
|
|
mod evaluator;
|
2024-05-04 20:40:02 +00:00
|
|
|
mod macros;
|
2024-05-04 19:23:06 +00:00
|
|
|
mod node;
|
2023-09-13 12:47:24 +00:00
|
|
|
mod parser;
|
|
|
|
|
2023-09-12 11:21:51 +00:00
|
|
|
fn main() {
|
2024-05-04 20:40:02 +00:00
|
|
|
let env = env::Environment::new();
|
2024-05-05 12:36:57 +00:00
|
|
|
let mut rl = DefaultEditor::new().unwrap();
|
2023-09-12 11:21:51 +00:00
|
|
|
|
2024-03-09 12:55:17 +00:00
|
|
|
println!("Mute -- REPL");
|
2023-09-12 11:21:51 +00:00
|
|
|
|
|
|
|
loop {
|
2024-05-05 12:36:57 +00:00
|
|
|
let readline = rl.readline("> ");
|
|
|
|
|
|
|
|
match readline {
|
|
|
|
Ok(line) => {
|
|
|
|
rl.add_history_entry(line.as_str()).unwrap();
|
|
|
|
|
|
|
|
let ast = parser::parse_str(&line).unwrap();
|
|
|
|
let res = evaluator::eval(&env, ast);
|
|
|
|
|
|
|
|
match res {
|
|
|
|
Ok(expressions) => expressions.into_iter().for_each(|expr| println!("{expr}")),
|
|
|
|
Err(err) => println!("{}", err),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Err(ReadlineError::Interrupted) => {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
Err(ReadlineError::Eof) => {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
Err(err) => {
|
|
|
|
println!("Error: {:?}", err);
|
|
|
|
break;
|
|
|
|
}
|
2023-09-19 12:17:13 +00:00
|
|
|
}
|
2023-09-12 11:21:51 +00:00
|
|
|
}
|
|
|
|
}
|