/** Serene --- Yet an other Lisp * * Copyright (c) 2020 Sameer Rahmani * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ use crate::core::read_eval_print; use crate::runtime::RT; use rustyline::error::ReadlineError; use rustyline::Editor; pub fn repl(rt: RT) { let mut rl = Editor::<()>::new(); let history = rt.history_file_path(); if rl.load_history(&history).is_err() && rt.is_debug() { println!("No previous history."); } loop { let prompt = format!("{}> ", rt.current_ns().name); let readline = rl.readline(&prompt); match readline { Ok(line) => { rl.add_history_entry(line.as_str()); read_eval_print(&rt, &line); } Err(ReadlineError::Interrupted) => { println!("CTRL-C"); break; } Err(ReadlineError::Eof) => { println!("CTRL-D"); break; } Err(err) => { println!("Error: {:?}", err); break; } } } rl.save_history(&history).unwrap(); }