1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
use super::Primitive::Symbol; use super::SExp::{self, Atom, Null, Pair}; use std::fmt; impl fmt::Debug for SExp { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Null => write!(f, "()",), Atom(a) => write!(f, "{:?}", a), Pair { head, tail } => match &**head { Atom(Symbol(q)) if q == "quote" => match &**tail { Pair { head: h2, tail: t2 } if **t2 == Null => write!(f, "'{}", h2), _ => write!(f, "'{}", tail), }, _ => { write!(f, "({:?}", head)?; match &**tail { Atom(a) => write!(f, " . {:?}", a)?, null_or_pair => null_or_pair .iter() .map(|item| write!(f, " {:?}", item)) .collect::<fmt::Result>()?, } write!(f, ")") } }, } } } impl fmt::Display for SExp { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Null => write!(f, "()",), Atom(a) => write!(f, "{}", a), Pair { head, tail } => match &**head { Atom(Symbol(q)) if q == "quote" => match &**tail { Pair { head: h2, tail: t2 } if **t2 == Null => write!(f, "'{}", h2), _ => write!(f, "'{}", tail), }, _ => { write!(f, "({}", head)?; match &**tail { Atom(a) => write!(f, " . {}", a)?, null_or_pair => null_or_pair .iter() .map(|item| write!(f, " {}", item)) .collect::<fmt::Result>()?, } write!(f, ")") } }, } } }