diff options
Diffstat (limited to 'src/lisp/expr.rs')
-rw-r--r-- | src/lisp/expr.rs | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/src/lisp/expr.rs b/src/lisp/expr.rs index 934bb4a..9f2dc8d 100644 --- a/src/lisp/expr.rs +++ b/src/lisp/expr.rs | |||
@@ -117,6 +117,8 @@ impl LispExpr { | |||
117 | .iter() | 117 | .iter() |
118 | .zip(o) | 118 | .zip(o) |
119 | .all(|(a, b)| matches!(a.compare(b, envs), Ok(true)))), | 119 | .all(|(a, b)| matches!(a.compare(b, envs), Ok(true)))), |
120 | (LispExpr::List(s), LispExpr::Unit) => Ok(s.len() == 0), | ||
121 | (LispExpr::Unit, LispExpr::List(s)) => Ok(s.len() == 0), | ||
120 | (LispExpr::StringLit(s), LispExpr::StringLit(o)) => Ok(s == o), | 122 | (LispExpr::StringLit(s), LispExpr::StringLit(o)) => Ok(s == o), |
121 | (LispExpr::Char(s), LispExpr::Char(o)) => Ok(s == o), | 123 | (LispExpr::Char(s), LispExpr::Char(o)) => Ok(s == o), |
122 | (LispExpr::BoolLit(s), LispExpr::BoolLit(o)) => Ok(s == o), | 124 | (LispExpr::BoolLit(s), LispExpr::BoolLit(o)) => Ok(s == o), |
@@ -142,6 +144,56 @@ impl LispExpr { | |||
142 | _ => Err(EvalError::TypeMismatch.into()), | 144 | _ => Err(EvalError::TypeMismatch.into()), |
143 | } | 145 | } |
144 | } | 146 | } |
147 | |||
148 | // have these be code gen'd somehow | ||
149 | pub fn unwrap_number(&self) -> LispNumber { | ||
150 | match &self { | ||
151 | LispExpr::Number(p) => p.clone(), | ||
152 | _ => panic!("attempt to call `unwrap_number` on invalid type"), | ||
153 | } | ||
154 | } | ||
155 | |||
156 | pub fn unwrap_list(&self) -> Vec<LispExpr> { | ||
157 | match &self { | ||
158 | LispExpr::List(p) => p.clone(), | ||
159 | _ => panic!("attempt to call `unwrap_number` on invalid type"), | ||
160 | } | ||
161 | } | ||
162 | |||
163 | pub fn unwrap_stringlit(&self) -> String { | ||
164 | match &self { | ||
165 | LispExpr::StringLit(p) => p.clone(), | ||
166 | _ => panic!("attempt to call `unwrap_stringlit` on invalid type"), | ||
167 | } | ||
168 | } | ||
169 | |||
170 | pub fn unwrap_ident(&self) -> String { | ||
171 | match &self { | ||
172 | LispExpr::Ident(p) => p.clone(), | ||
173 | _ => panic!("attempt to call `unwrap_ident` on invalid type"), | ||
174 | } | ||
175 | } | ||
176 | |||
177 | pub fn unwrap_primitive_func(&self) -> PrimitiveFunc { | ||
178 | match &self { | ||
179 | LispExpr::PrimitiveFunc(p) => p.clone(), | ||
180 | _ => panic!("attempt to call `unwrap_primitive_func` on invalid type"), | ||
181 | } | ||
182 | } | ||
183 | |||
184 | pub fn unwrap_function(&self) -> LispFunction { | ||
185 | match &self { | ||
186 | LispExpr::Function(p) => p.clone(), | ||
187 | _ => panic!("attempt to call `unwrap_function` on invalid type"), | ||
188 | } | ||
189 | } | ||
190 | |||
191 | pub fn cast_bool(&self) -> bool { | ||
192 | match &self { | ||
193 | LispExpr::BoolLit(false) => false, | ||
194 | _ => true, | ||
195 | } | ||
196 | } | ||
145 | } | 197 | } |
146 | 198 | ||
147 | impl fmt::Display for LispExpr { | 199 | impl fmt::Display for LispExpr { |
@@ -270,11 +322,3 @@ impl TryFrom<LispExpr> for BoolLit { | |||
270 | } | 322 | } |
271 | } | 323 | } |
272 | } | 324 | } |
273 | |||
274 | pub fn is_ident<E: AsRef<LispExpr>>(expr: E) -> bool { | ||
275 | matches!(expr.as_ref(), LispExpr::Ident(_)) | ||
276 | } | ||
277 | |||
278 | pub fn is_number<E: AsRef<LispExpr>>(expr: E) -> bool { | ||
279 | matches!(expr.as_ref(), LispExpr::Number(_)) | ||
280 | } | ||