aboutsummaryrefslogtreecommitdiff
path: root/src/lisp/expr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lisp/expr.rs')
-rw-r--r--src/lisp/expr.rs60
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
147impl fmt::Display for LispExpr { 199impl fmt::Display for LispExpr {
@@ -270,11 +322,3 @@ impl TryFrom<LispExpr> for BoolLit {
270 } 322 }
271 } 323 }
272} 324}
273
274pub fn is_ident<E: AsRef<LispExpr>>(expr: E) -> bool {
275 matches!(expr.as_ref(), LispExpr::Ident(_))
276}
277
278pub fn is_number<E: AsRef<LispExpr>>(expr: E) -> bool {
279 matches!(expr.as_ref(), LispExpr::Number(_))
280}