From ae79d5a8b0166d43d3ff48aa593db6038b40410b Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 19 Mar 2021 21:57:34 +0530 Subject: begin work on scripting lisp --- src/lisp/mod.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/lisp/mod.rs (limited to 'src/lisp/mod.rs') diff --git a/src/lisp/mod.rs b/src/lisp/mod.rs new file mode 100644 index 0000000..5d8965f --- /dev/null +++ b/src/lisp/mod.rs @@ -0,0 +1,46 @@ +use std::fmt; + +use number::LispNumber; + +mod error; +mod lex; +mod number; + +#[derive(Debug, PartialEq)] +pub enum LispExpr { + Number(LispNumber), + List(Vec), + StringLit(String), + BoolLit(bool), + Ident(String), + Function(LispFunction), +} + +impl fmt::Display for LispExpr { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + LispExpr::Number(n) => write!(f, "{}", n)?, + LispExpr::List(l) => { + for expr in l.iter() { + write!(f, " {} ", expr)? + } + } + LispExpr::StringLit(s) => write!(f, "{:?}", s)?, + LispExpr::BoolLit(b) => { + if *b { + write!(f, "#t")? + } else { + write!(f, "#f")? + } + } + LispExpr::Ident(s) => write!(f, "{}", s)?, + LispExpr::Function(_) => write!(f, "<#procedure>")?, + }; + Ok(()) + } +} + +pub type Environment = Vec<(String, LispExpr)>; + +#[derive(Debug, PartialEq)] +struct LispFunction {} -- cgit v1.2.3