1mod env;
2mod eval;
3mod lexer;
4mod object;
5mod parser;
6
7use object::Object;
8use std::cell::RefCell;
9use std::rc::Rc;
10
11pub fn lisp_rs_eval(input: &str) -> String {
12 let mut env = Rc::new(RefCell::new(env::Env::new()));
13 let val = eval::eval(input, &mut env);
14 match val {
15 Ok(Object::Void) => "".to_string(),
16 Ok(Object::Integer(n)) => n.to_string(),
17 Ok(Object::Bool(b)) => b.to_string(),
18 Ok(Object::Symbol(s)) => s.to_string(),
19 Ok(Object::Lambda(params, body, _)) => {
20 let mut res = "Lambda(".to_string();
21 for param in params {
22 res.push_str(&format!("{} ", param));
23 }
24 res.push(')');
25 for expr in (*body).iter() {
26 res.push_str(&format!(" {}", expr));
27 }
28 res
29 }
30 Ok(Object::List(list)) => {
31 let mut res = "(".to_string();
32 for (i, obj) in (*list).iter().enumerate() {
33 if i > 0 {
34 res.push(' ');
35 }
36 res.push_str(&format!("{}", obj));
37 }
38 res.push(')');
39 res
40 }
41 Ok(Object::ListData(list)) => {
42 let mut res = "(".to_string();
43 for (i, obj) in list.iter().enumerate() {
44 if i > 0 {
45 res.push(' ');
46 }
47 res.push_str(&format!("{}", obj));
48 }
49 res.push(')');
50 res.to_string()
51 }
52 Ok(Object::String(s)) => s.to_string(),
53 Ok(Object::Keyword(s)) => s.to_string(),
54 Ok(Object::BinaryOp(s)) => s.to_string(),
55 Ok(Object::Float(n)) => n.to_string(),
56 Err(e) => e.to_string(),
57 }
58}