From 827e54124f03fd11d497caa8213ca583f480b982 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 2 Apr 2021 11:05:11 +0530 Subject: add DottedList type, fix `cons` finally --- src/lisp/expr.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/lisp/expr.rs') diff --git a/src/lisp/expr.rs b/src/lisp/expr.rs index 31476c9..aeaa2d8 100644 --- a/src/lisp/expr.rs +++ b/src/lisp/expr.rs @@ -62,6 +62,7 @@ pub enum LispExpr { Unit, Number(LispNumber), List(Vec), + DottedList(Vec), StringLit(String), BoolLit(bool), Ident(Ident), @@ -157,7 +158,14 @@ impl LispExpr { pub fn unwrap_list(&self) -> Vec { match &self { LispExpr::List(p) => p.clone(), - _ => panic!("attempt to call `unwrap_number` on invalid type"), + _ => panic!("attempt to call `unwrap_list` on invalid type"), + } + } + + pub fn unwrap_dotted_list(&self) -> Vec { + match &self { + LispExpr::DottedList(p) => p.clone(), + _ => panic!("attempt to call `unwrap_dotted_list` on invalid type"), } } @@ -209,6 +217,13 @@ impl fmt::Display for LispExpr { &l.iter().map(|expr| format!("{}", expr)).collect::>()[..].join(" ") )?; } + LispExpr::DottedList(l) => { + write!(f, "(")?; + for item in &l[..l.len() - 1] { + write!(f, "{} ", item)?; + } + write!(f, ". {})", &l[l.len() - 1])?; + } LispExpr::StringLit(s) => write!(f, "{:?}", s)?, LispExpr::Char(c) => write!(f, "{}", c)?, LispExpr::BoolLit(b) => { @@ -237,7 +252,14 @@ impl fmt::Debug for LispExpr { match self { LispExpr::Unit => f.debug_tuple("Unit").finish(), LispExpr::Number(n) => write!(f, "Number({:?})", n), - LispExpr::List(l) => f.debug_list().entries(l.iter()).finish(), + LispExpr::List(l) => { + write!(f, "List ")?; + f.debug_list().entries(l.iter()).finish() + }, + LispExpr::DottedList(l) => { + write!(f, "DottedList ")?; + f.debug_list().entries(l.iter()).finish() + }, LispExpr::StringLit(s) => write!(f, "String({:?})", s), LispExpr::Char(c) => write!(f, "Char({:?})", c), LispExpr::BoolLit(b) => write!(f, "Bool({:?})", b), -- cgit v1.2.3