use crate::{Environment, eval::apply::eval_apply, value::Value};
pub(crate) fn builtin(args: &[Value], env: &Environment) -> Option<(Value, Environment)> {
let mut local_env = env.clone();
let mut final_result = Value::Unit;
for arg in args.iter() {
match eval_apply(arg, &local_env) {
Some((result, new_env)) => {
local_env.extend(new_env);
final_result = result;
}
None => {
eprintln!(
concat!(
"Error[ksl::builtin::block]: ",
"Cannot evaluate expression {:?}."
),
arg
);
return None;
}
}
}
Some((final_result, Environment::new()))
}