lisp_rs/
lib.rs

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}