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;