use crate::{Environment, eval::extract_lambda_env, value::Value};
pub(crate) fn builtin(args: &[Value], env: &Environment) -> Option<(Value, Environment)> {
if let [Value::List(params), func_body] = &args[..] {
let mut symbol_list = Vec::with_capacity(params.len());
for param in params.iter() {
match param {
Value::Identity(symbol) => {
symbol_list.push(symbol.clone());
}
e => {
eprintln!(
concat!(
"Error[ksl::builtin::fun]: ",
"Expected a symbol, but got `{:?}`."
),
e
);
return None;
}
}
}
let minimum_env = extract_lambda_env(&symbol_list, func_body, env);
Some((
Value::Lambda(symbol_list, Box::new(func_body.clone()), minimum_env),
Environment::new(),
))
} else {
eprintln!(concat!(
"Error[ksl::builtin::fun]: ",
"Only accepts a list of symbols and a value expression as arguments.",
));
None
}
}