diff options
author | Kjetil Orbekk <kj@orbekk.com> | 2023-11-19 19:28:42 -0500 |
---|---|---|
committer | Kjetil Orbekk <kj@orbekk.com> | 2023-11-19 19:28:54 -0500 |
commit | 465c3a1045625d12a73e723651ae9bd9b0a51cb1 (patch) | |
tree | d0a70280523b651be3510391d1ed0aa3933c96e5 /lisp/src/eval.rs | |
parent | 79a31f87b668f9ef67a8cd6bc7826031fe3be18e (diff) |
lisp eval
Diffstat (limited to 'lisp/src/eval.rs')
-rw-r--r-- | lisp/src/eval.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lisp/src/eval.rs b/lisp/src/eval.rs new file mode 100644 index 0000000..2afe049 --- /dev/null +++ b/lisp/src/eval.rs @@ -0,0 +1,59 @@ +use crate::ast::Val; + +pub fn eval_f(f: &str, args: &[Val]) -> Val { + match f { + "quote" if args.len() == 1 => args[0].clone(), + _ => Val::Atom("error".to_string()), + } +} + +pub fn eval(v: &Val) -> Val { + match v { + v @ Val::Atom(_) => v.clone(), + v @ Val::I64(_) => v.clone(), + v @ Val::String(_) => v.clone(), + v @ Val::List(vs) => { + if vs.is_empty() { + return v.clone(); + } + match &vs[0] { + Val::Atom(f) => eval_f(&f, &vs[1..]), + _ => v.clone(), + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn eval_atom() { + assert_eq!( + eval(&Val::Atom("x".to_string())), + Val::Atom("x".to_string()) + ); + } + #[test] + fn eval_i64() { + assert_eq!(eval(&Val::I64(1)), Val::I64(1)); + } + #[test] + fn eval_string() { + assert_eq!( + eval(&Val::String("hello".to_string())), + Val::String("hello".to_string()) + ); + } + #[test] + fn eval_quote() { + assert_eq!( + eval(&Val::List(vec!( + Val::Atom("quote".to_string()), + Val::Atom("x".to_string()) + ))), + Val::Atom("x".to_string()) + ); + } +} |