lisp-rs 2.0.2

Lisp interpreter in Rust
Documentation
use crate::env::*;
use std::cell::RefCell;
use std::fmt;
use std::rc::Rc;

#[derive(Debug, Clone, PartialEq)]
pub enum Object {
  Void,
  Keyword(String),
  BinaryOp(String),
  Integer(i64),
  Float(f64),
  Bool(bool),
  String(String),
  Symbol(String),
  ListData(Vec<Object>),
  Lambda(Vec<String>, Rc<Vec<Object>>, Rc<RefCell<Env>>),
  List(Rc<Vec<Object>>),
}

impl fmt::Display for Object {
  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    match self {
      Object::Void => write!(f, "Void"),
      Object::Keyword(s) => write!(f, "{}", s),
      Object::BinaryOp(s) => write!(f, "{}", s),
      Object::Integer(n) => write!(f, "{}", n),
      Object::Float(n) => write!(f, "{}", n),
      Object::Bool(b) => write!(f, "{}", b),
      Object::Symbol(s) => write!(f, "{}", s),
      Object::String(s) => write!(f, "{}", s),
      Object::Lambda(params, body, _env) => {
        write!(f, "Lambda(")?;
        for param in params {
          write!(f, "{} ", param)?;
        }
        write!(f, ")")?;
        for expr in (*body).iter() {
          write!(f, " {}", expr)?;
        }
        Ok(())
      }
      Object::List(list) => {
        write!(f, "(")?;
        for (i, obj) in (*list).iter().enumerate() {
          if i > 0 {
            write!(f, " ")?;
          }
          write!(f, "{}", obj)?;
        }
        write!(f, ")")
      }
      Object::ListData(list) => {
        write!(f, "(")?;
        for (i, obj) in list.iter().enumerate() {
          if i > 0 {
            write!(f, " ")?;
          }
          write!(f, "{}", obj)?;
        }
        write!(f, ")")
      }
    }
  }
}