From 30ebafb89d147539f412a428015d7e6f5093ccd3 Mon Sep 17 00:00:00 2001 From: Roman Godmaire Date: Sat, 4 May 2024 17:43:38 -0400 Subject: [PATCH] fix: support if without else If statements without an else should evaluate to nil if the condition is not valid. These are mainly used for side effects, but sometimes you might want a value. --- src/env/core.rs | 5 +++++ src/evaluator.rs | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/env/core.rs b/src/env/core.rs index b36c3f7..a6d1606 100644 --- a/src/env/core.rs +++ b/src/env/core.rs @@ -242,6 +242,11 @@ pub(super) fn core() -> HashMap { ( "if", Node::Special(|env, args| { + let mut args = args; + if args.len() == 2 { + args.push(Node::Nil) + } + arg_count!(3, args.len()); let mut args = args.into_iter(); diff --git a/src/evaluator.rs b/src/evaluator.rs index b79a418..fe8b79b 100644 --- a/src/evaluator.rs +++ b/src/evaluator.rs @@ -141,6 +141,8 @@ mod test { #[case("(if false true false)", "false")] #[case("(if 4 true false)", "true")] #[case("(if \"blue\" true false)", "true")] + #[case("(if true 3)", "3")] + #[case("(if false 3)", "()")] // Functions #[case("((fn* (a) a) 3)", "3")] #[case("((fn* (a) (+ a 2)) 1)", "3")]