oris 0.2.1

An interpreter for Monkey
Documentation
macro_rules! propagate {
    ($eval:expr) => {
        match $eval {
            Ok($crate::eval::Eval::Continue(x)) => x,
            Ok($crate::eval::Eval::Return(b)) => return Ok($crate::eval::Eval::Return(b)),
            Err(err) => return Err(err),
        }
    };
}

macro_rules! args {
    ($args:ident @ $pos:ident = $($binding:ident),*) => {
        let [$($binding),*] = match <[$crate::eval::value::Value; args!(@count $($binding),*)]>::try_from($args) {
            Ok(xs) => { xs }
            Err(err) => {
                  return Err($crate::eval::Error::ArgCount {
                    pos: $pos,
                    supplied: err.len(),
                    expected: args!(@count $($binding),*),
                });
            }
        };
    };

    (@count $($binding:ident),*) => {
        0usize $( + args!(@subst $binding 1usize) )*
    };

    (@subst $from:tt $to:tt) => {
        $to
    };
}