use crate::{BULTIN_FUNCTIONS, Environment, eval::apply::eval_apply, value::Value};
pub(crate) fn builtin(args: &[Value], env: &Environment) -> Option<(Value, Environment)> {
if let [Value::Identity(id), val] = &args[..] {
if BULTIN_FUNCTIONS.contains(&id.as_str()) {
eprintln!(
concat!(
"Error[ksl::builtin::let]: ",
"Built-in function `{}` cannot be rebound."
),
id
);
None
} else {
match eval_apply(val, env) {
Some((result, _)) => Some((Value::Unit, Environment::from([(id.clone(), result)]))),
None => {
eprintln!(
concat!(
"Error[ksl::builtin::let]: ",
"Cannot evaluate expression {:?}."
),
val
);
None
}
}
}
} else {
eprintln!(
concat!(
"Error[ksl::builtin::let]: ",
"Only accepts a single symbol and a value as arguments, ",
"but {:?} were passed."
),
args
);
None
}
}