From 4f882b35a685db40a7f85740b4e04dc6355ad5ff Mon Sep 17 00:00:00 2001 From: Roman Godmaire Date: Sat, 11 May 2024 07:53:39 -0400 Subject: [PATCH] refactor: move arg count We only use this in the evaluator env, so move it to there. --- mute-interpreter/src/env/core.rs | 7 ++----- mute-interpreter/src/env/io.rs | 5 ++--- mute-interpreter/src/{ => env}/macros.rs | 7 ++++++- mute-interpreter/src/env/mod.rs | 1 + mute-interpreter/src/evaluator.rs | 1 - mute-interpreter/src/lib.rs | 1 - 6 files changed, 11 insertions(+), 11 deletions(-) rename mute-interpreter/src/{ => env}/macros.rs (75%) diff --git a/mute-interpreter/src/env/core.rs b/mute-interpreter/src/env/core.rs index 6d4d548..cf1a6e7 100644 --- a/mute-interpreter/src/env/core.rs +++ b/mute-interpreter/src/env/core.rs @@ -1,8 +1,7 @@ use std::borrow::Borrow; use std::collections::HashMap; -use super::{NativeFunc, Value}; -use crate::macros::arg_count; +use super::{macros::arg_count, NativeFunc, Value}; use crate::Node; macro_rules! arithmetic { @@ -69,9 +68,7 @@ pub(super) fn core() -> HashMap { ( "eq?", NativeFunc(|args| { - if args.len() < 2 { - return Node::Error(format!("expected at least 2 args, got {}", args.len())); - } + arg_count!(min: 2, args.len()); args.into_iter() .reduce(|lhs, rhs| match (lhs, rhs) { diff --git a/mute-interpreter/src/env/io.rs b/mute-interpreter/src/env/io.rs index f668637..b3f4da9 100644 --- a/mute-interpreter/src/env/io.rs +++ b/mute-interpreter/src/env/io.rs @@ -1,7 +1,7 @@ use std::borrow::Borrow; use std::collections::HashMap; -use super::{NativeFunc, Value}; +use super::{macros::arg_count, NativeFunc, Value}; use crate::Node; pub(super) fn io() -> HashMap { @@ -39,8 +39,7 @@ pub(super) fn io() -> HashMap { ( "read-file", NativeFunc(|args| { - // TODO: implement this - // arg_count!(1, args.len()); + arg_count!(1, args.len()); let val = args[0].borrow(); if let Node::String(path) = val { diff --git a/mute-interpreter/src/macros.rs b/mute-interpreter/src/env/macros.rs similarity index 75% rename from mute-interpreter/src/macros.rs rename to mute-interpreter/src/env/macros.rs index 219d320..7cfa3fe 100644 --- a/mute-interpreter/src/macros.rs +++ b/mute-interpreter/src/env/macros.rs @@ -1,4 +1,3 @@ -// TODO: argument count checking should happen at parse time, not at runtime #[macro_export] macro_rules! arg_count { ($expected:expr, $given:expr) => { @@ -7,6 +6,12 @@ macro_rules! arg_count { } }; + (min: $min:expr, $given:expr) => { + if $given < $min { + return Node::Error(format!("expected at least {} args, got {}", $min, $given)); + } + }; + (modulo: $modulo:expr, $given:expr) => { if $given % $modulo != 0 { return Node::Error(format!( diff --git a/mute-interpreter/src/env/mod.rs b/mute-interpreter/src/env/mod.rs index 231796f..382f078 100644 --- a/mute-interpreter/src/env/mod.rs +++ b/mute-interpreter/src/env/mod.rs @@ -6,6 +6,7 @@ use crate::Node; mod core; mod io; +mod macros; #[derive(Debug, Clone)] pub struct NativeFunc(fn(args: Vec) -> Node); diff --git a/mute-interpreter/src/evaluator.rs b/mute-interpreter/src/evaluator.rs index cfb7761..7f69894 100644 --- a/mute-interpreter/src/evaluator.rs +++ b/mute-interpreter/src/evaluator.rs @@ -7,7 +7,6 @@ pub fn eval(env: &Environment, ast: Vec) -> Result> { let mut exprs = Vec::new(); for node in ast { - dbg!(&node); let res = eval_node(env, node)?; if let Node::Void = res { continue; diff --git a/mute-interpreter/src/lib.rs b/mute-interpreter/src/lib.rs index caa0a23..6a8be98 100644 --- a/mute-interpreter/src/lib.rs +++ b/mute-interpreter/src/lib.rs @@ -2,7 +2,6 @@ mod env; mod error; mod evaluator; -mod macros; pub use env::Environment; pub use error::{Error, Result};