fix: provide details on argument count errors

This commit is contained in:
Roman Godmaire 2024-02-17 06:58:22 -05:00
parent 4e7c8eba01
commit 288e2f4feb
2 changed files with 9 additions and 9 deletions

View file

@ -107,7 +107,7 @@ pub fn core_environment() -> Rc<Environment> {
"hashmap", "hashmap",
Expression::NativeFunc(|args| { Expression::NativeFunc(|args| {
if args.len() % 2 != 0 { if args.len() % 2 != 0 {
Err(Error::MismatchedArgCount)? Err(Error::MismatchedArgCount(2, args.len()))?
} }
let mut index = -1; let mut index = -1;
@ -132,7 +132,7 @@ pub fn core_environment() -> Rc<Environment> {
"if", "if",
Expression::NativeFunc(|args| { Expression::NativeFunc(|args| {
if args.len() != 3 { if args.len() != 3 {
Err(Error::MismatchedArgCount)? Err(Error::MismatchedArgCount(3, args.len()))?
} }
let (cond, consequence, alternative) = let (cond, consequence, alternative) =
@ -152,7 +152,7 @@ pub fn core_environment() -> Rc<Environment> {
Expression::Special(|env, args| { Expression::Special(|env, args| {
let mut args = args.into_iter(); let mut args = args.into_iter();
if args.len() != 2 { if args.len() != 2 {
Err(Error::MismatchedArgCount)? Err(Error::MismatchedArgCount(2, args.len()))?
} }
let key = match args.next().unwrap() { let key = match args.next().unwrap() {
@ -171,7 +171,7 @@ pub fn core_environment() -> Rc<Environment> {
"let*", "let*",
Expression::Special(|env, args| { Expression::Special(|env, args| {
if args.len() != 2 { if args.len() != 2 {
Err(Error::MismatchedArgCount)? Err(Error::MismatchedArgCount(2, args.len()))?
} }
let mut args = args.into_iter(); let mut args = args.into_iter();
@ -189,7 +189,7 @@ pub fn core_environment() -> Rc<Environment> {
outer: Some(env.clone()), outer: Some(env.clone()),
} }
} }
Node::List(_) => Err(Error::MismatchedArgCount)?, Node::List(list) => Err(Error::MismatchedArgCount(2, list.len()))?,
_ => Err(Error::ExpectedList)?, _ => Err(Error::ExpectedList)?,
}; };
@ -201,7 +201,7 @@ pub fn core_environment() -> Rc<Environment> {
Expression::Special(|env, args| { Expression::Special(|env, args| {
let mut args = args; let mut args = args;
if args.len() != 2 { if args.len() != 2 {
Err(Error::MismatchedArgCount)? Err(Error::MismatchedArgCount(2, args.len()))?
} }
let arg_list = args.remove(0); let arg_list = args.remove(0);

View file

@ -89,8 +89,8 @@ pub enum Error {
ExpectedSymbol, ExpectedSymbol,
#[error("expected list")] #[error("expected list")]
ExpectedList, ExpectedList,
#[error("incorrect number of arguments passed to function")] #[error("expected {0} arguments, got {1}")]
MismatchedArgCount, MismatchedArgCount(usize, usize),
} }
pub fn eval(env: Rc<Environment>, ast: Vec<Node>) -> Result<Vec<Rc<Expression>>> { pub fn eval(env: Rc<Environment>, ast: Vec<Node>) -> Result<Vec<Rc<Expression>>> {
@ -137,7 +137,7 @@ fn eval_ast_node(env: Rc<Environment>, ast_node: Node) -> Result<Rc<Expression>>
} => { } => {
let args = list; let args = list;
if args.len() != params.len() { if args.len() != params.len() {
Err(Error::MismatchedArgCount)? Err(Error::MismatchedArgCount(params.len(), args.len()))?
} }
let args = args let args = args