/* 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::namespace; use crate::runtime; use rustyline::error::ReadlineError; use rustyline::Editor; pub fn repl(rt: &runtime::Runtime) { let mut rl = Editor::<()>::new(); let history = runtime::history_file_path(); if rl.load_history(&history).is_err() && runtime::is_debug(&rt) { println!("No previous history."); } loop { let prompt = format!("{}> ", namespace::get_name(runtime::current_ns(rt))); 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(); }