From 282071efc145d13b216039fe54af9ad652c0354d Mon Sep 17 00:00:00 2001 From: Roman Godmaire Date: Sat, 17 Feb 2024 22:36:01 -0500 Subject: [PATCH] fix: dynamic counting for modulo arg counts --- src/evaluator/env.rs | 4 +--- src/evaluator/macros.rs | 7 +++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/evaluator/env.rs b/src/evaluator/env.rs index 5c18da4..25b14d9 100644 --- a/src/evaluator/env.rs +++ b/src/evaluator/env.rs @@ -107,9 +107,7 @@ pub fn core_environment() -> Rc { ( "hashmap", Expression::NativeFunc(|args| { - if args.len() % 2 != 0 { - Err(Error::MismatchedArgCount(2, args.len()))? - } + arg_count!(modulo: 2, args.len()); let mut index = -1; let (keys, values): (Vec<_>, Vec<_>) = args.into_iter().partition(|_| { diff --git a/src/evaluator/macros.rs b/src/evaluator/macros.rs index 6a0c343..36d6532 100644 --- a/src/evaluator/macros.rs +++ b/src/evaluator/macros.rs @@ -5,6 +5,13 @@ macro_rules! arg_count { Err(Error::MismatchedArgCount($expected, $given))? } }; + + (modulo: $modulo:expr, $given:expr) => { + Err(Error::MismatchedArgCount( + ($given / $modulo) * $modulo + $modulo, + $given, + ))? + }; } pub(crate) use arg_count;