/* relish: versatile lisp shell * Copyright (C) 2021 Aidan Hahn * * 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 3 of the License, or * (at your option) any later version. * * 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::func::{FTable, Function, Args, Operation}; use crate::vars::{VTable}; use crate::segment::{Ctr, Ast, circuit, ast_as_string}; use std::rc::Rc; use std::cell::RefCell; pub fn get_echo() -> Function { return Function{ name: String::from("echo"), loose_syms: false, eval_lazy: false, args: Args::Lazy(-1), function: Operation::Internal( |a: Ast, _b: Rc>, _c: Rc>| -> Ctr { let mut string = String::from(""); if !circuit(a, &mut |arg: &Ctr| { match arg { // should be a thing here Ctr::Symbol(_) => return false, Ctr::String(s) => string.push_str(&s), Ctr::Integer(i) => string.push_str(&i.to_string()), Ctr::Float(f) => string.push_str(&f.to_string()), Ctr::Bool(b) => string.push_str(&b.to_string()), Ctr::Seg(c) => string.push_str(ast_as_string(c.clone(), true).as_str()), Ctr::None => () } string.push_str("\n"); return true; }) { // TODO: use custom logger println!("Echo failure!") } return Ctr::String(string); } ) }; }