diff --git a/src/evaluator/env.rs b/src/evaluator/env.rs index b9f63dd..c4070a5 100644 --- a/src/evaluator/env.rs +++ b/src/evaluator/env.rs @@ -127,6 +127,20 @@ pub fn core_environment() -> Rc { Ok(Rc::new(Expression::HashMap(res))) }), ), + ( + "eq?", + Expression::NativeFunc(|args| { + if args.len() != 2 { + Err(Error::MismatchedArgCount(2, args.len()))? + } + + if args[0] == args[1] { + return Ok(TRUE.with(|inner| inner.clone())); + } + + return Ok(FALSE.with(|inner| inner.clone())); + }), + ), ( "not", Expression::NativeFunc(|args| { diff --git a/src/evaluator/mod.rs b/src/evaluator/mod.rs index a50d96d..bc4d553 100644 --- a/src/evaluator/mod.rs +++ b/src/evaluator/mod.rs @@ -219,6 +219,9 @@ mod test { #[case("((fn* (a) a) 3)", "3")] #[case("((fn* (a) (+ a 2)) 1)", "3")] #[case("((fn* (a b) (+ a b)) 1 2)", "3")] + // Boolean operations + #[case("(eq? 1 1)", "true")] + #[case("(eq? 1 2)", "false")] #[case("(not false)", "true")] #[case("(not true)", "false")] #[case("(not nil)", "false")]