nyavascript 0.1.0

Lisp implementation. Called NyavaScript because I'm a monster
Documentation
use crate::evaluate::{
    Environment as Env,
    Result as EvalResult,
};
use crate::s_expression::SExpressionRef as SXRef;

pub type MacroFunc = fn(SXRef, &mut Env) -> EvalResult;

#[derive(Clone)]
pub struct RustMacro(MacroFunc);

impl RustMacro {
    pub fn new(f: MacroFunc) -> RustMacro {
        RustMacro(f)
    }

    pub fn execute(&self, list: SXRef, env: &mut Env) -> EvalResult {
        self.0(list, env)
    }
}

impl From<MacroFunc> for RustMacro {
    fn from(f: MacroFunc) -> Self {
        Self::new(f)
    }
}

impl PartialEq for RustMacro {
    fn eq(&self, _other: &Self) -> bool {
        panic!("Do not call PartialEq on a RustMacro.");
    }
}

impl std::fmt::Debug  for RustMacro {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "[RustMacro]")
    }
}

impl std::fmt::Display for RustMacro {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "[RustMacro]")
    }
}