#[allow(unused_macros)]
#[macro_export]
macro_rules! lisp {
( { $e:expr } ) => {
$e
};
( ( $($val:tt)* ) ) => {
$crate::model::Value::List([ $(lisp!{ $val }),* ].iter().collect::<$crate::model::List>())
};
(nil) => { $crate::model::Value::NIL };
(NIL) => { $crate::model::Value::NIL };
(t) => { $crate::model::Value::True };
(T) => { $crate::model::Value::True };
(f) => { $crate::model::Value::False };
(F) => { $crate::model::Value::False };
($sym:ident) => {
$crate::model::Value::Symbol($crate::model::Symbol(String::from(stringify!( $sym ))))
};
( + ) => { $crate::model::Value::Symbol($crate::model::Symbol(String::from("+"))) };
( - ) => { $crate::model::Value::Symbol($crate::model::Symbol(String::from("-"))) };
( * ) => { $crate::model::Value::Symbol($crate::model::Symbol(String::from("*"))) };
( / ) => { $crate::model::Value::Symbol($crate::model::Symbol(String::from("/"))) };
( == ) => { $crate::model::Value::Symbol($crate::model::Symbol(String::from("=="))) };
( != ) => { $crate::model::Value::Symbol($crate::model::Symbol(String::from("!="))) };
( < ) => { $crate::model::Value::Symbol($crate::model::Symbol(String::from("<"))) };
( <= ) => { $crate::model::Value::Symbol($crate::model::Symbol(String::from("<="))) };
( > ) => { $crate::model::Value::Symbol($crate::model::Symbol(String::from(">"))) };
( >= ) => { $crate::model::Value::Symbol($crate::model::Symbol(String::from(">="))) };
($e:literal) => {
$crate::parser::parse(stringify!($e)).next().unwrap().unwrap()
};
}