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