diff options
Diffstat (limited to 'src/lisp/mod.rs')
-rw-r--r-- | src/lisp/mod.rs | 43 |
1 files changed, 3 insertions, 40 deletions
diff --git a/src/lisp/mod.rs b/src/lisp/mod.rs index 5d8965f..b863bba 100644 --- a/src/lisp/mod.rs +++ b/src/lisp/mod.rs | |||
@@ -1,46 +1,9 @@ | |||
1 | use std::fmt; | ||
2 | |||
3 | use number::LispNumber; | ||
4 | |||
5 | mod error; | 1 | mod error; |
2 | mod expr; | ||
6 | mod lex; | 3 | mod lex; |
7 | mod number; | 4 | mod number; |
5 | mod parse; | ||
8 | 6 | ||
9 | #[derive(Debug, PartialEq)] | 7 | use expr::LispExpr; |
10 | pub enum LispExpr { | ||
11 | Number(LispNumber), | ||
12 | List(Vec<LispExpr>), | ||
13 | StringLit(String), | ||
14 | BoolLit(bool), | ||
15 | Ident(String), | ||
16 | Function(LispFunction), | ||
17 | } | ||
18 | |||
19 | impl fmt::Display for LispExpr { | ||
20 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | ||
21 | match self { | ||
22 | LispExpr::Number(n) => write!(f, "{}", n)?, | ||
23 | LispExpr::List(l) => { | ||
24 | for expr in l.iter() { | ||
25 | write!(f, " {} ", expr)? | ||
26 | } | ||
27 | } | ||
28 | LispExpr::StringLit(s) => write!(f, "{:?}", s)?, | ||
29 | LispExpr::BoolLit(b) => { | ||
30 | if *b { | ||
31 | write!(f, "#t")? | ||
32 | } else { | ||
33 | write!(f, "#f")? | ||
34 | } | ||
35 | } | ||
36 | LispExpr::Ident(s) => write!(f, "{}", s)?, | ||
37 | LispExpr::Function(_) => write!(f, "<#procedure>")?, | ||
38 | }; | ||
39 | Ok(()) | ||
40 | } | ||
41 | } | ||
42 | 8 | ||
43 | pub type Environment = Vec<(String, LispExpr)>; | 9 | pub type Environment = Vec<(String, LispExpr)>; |
44 | |||
45 | #[derive(Debug, PartialEq)] | ||
46 | struct LispFunction {} | ||