use myslip::parse::parsetree::parse_to_ast; use myslip::sexp::{SExp::*, SLeaf::Nil}; use std::{io, io::Write}; fn main() { match repl() { Ok(()) => println!("bye :)"), Err(e) => { println!("Error: {}", e); main(); }, } } fn repl() -> Result<(), String> { let stdin = io::stdin(); let mut input = String::new(); let mut stdout = io::stdout(); print!("> "); match stdout.flush() { Ok(_) => (), Err(_) => println!("Enter s-expression:"), }; let mut success = stdin.read_line(&mut input); while success.is_ok() && input != "exit\n" { if let Ok(0) = success { print!("\n"); break; } let expression = match parse_to_ast(&input) { Ok(SCons(a, b)) if *b == Atom(Nil) => Ok(*a), t => t }?; let ty = expression.type_check().map_err(|e| e.to_string())?; let result = expression.multistep()?; println!("{} : {}", result, ty); print!("> "); match stdout.flush() { Ok(_) => (), Err(_) => println!("Enter s-expression:"), }; input.clear(); success = stdin.read_line(&mut input); } match success { Ok(_) => Ok(()), Err(e) => Err(format!("read error: {e}")), } }