use crate::{Environment, FALSE_SYMBOL, TRUE_SYMBOL, eval::apply::eval_apply, value::Value};
pub(crate) fn builtin(args: &[Value], env: &Environment) -> Option<(Value, Environment)> {
if let [v] = &args[..] {
match eval_apply(v, env) {
Some((Value::Atom(p), _)) if &p == TRUE_SYMBOL || &p == FALSE_SYMBOL => Some((
Value::Atom(String::from(if &p == FALSE_SYMBOL {
TRUE_SYMBOL
} else {
FALSE_SYMBOL
})),
Environment::new(),
)),
Some((e, _)) => {
eprintln!(
concat!(
"Error[ksl::builtin::not]: ",
"Only accepts 1 boolean, but {:?} was passed."
),
e
);
None
}
None => {
eprintln!(
concat!(
"Error[ksl::builtin::not]: ",
"Cannot evaluate expression {:?}."
),
v
);
None
}
}
} else {
eprintln!(
concat!(
"Error[ksl::builtin::not]: ",
"Only accepts 1 argument, but {} were passed."
),
args.len()
);
None
}
}