ksl 0.1.5

KSL core library and interpreter
Documentation
use crate::{Environment, eval::apply::eval_apply, value::Value};

pub(crate) fn builtin(
    args: &[Value],
    is_prepend: bool,
    env: &Environment,
) -> Option<(Value, Environment)> {
    let mut local_environment = Environment::new();

    if let [lst, new_element] = &args[..] {
        match eval_apply(lst, env) {
            Some((Value::List(mut elements), new_env_lst)) => {
                local_environment.extend(new_env_lst);
                match eval_apply(new_element, env) {
                    Some((element, new_env_var)) => {
                        local_environment.extend(new_env_var);
                        if is_prepend {
                            elements.insert(0, element)
                        } else {
                            elements.push(element)
                        };
                        Some((Value::List(elements), local_environment))
                    }
                    None => {
                        eprintln!(
                            concat!(
                                "Error[ksl::builtin::pend]: ",
                                "Cannot evaluate expression {:?}."
                            ),
                            new_element
                        );
                        None
                    }
                }
            }
            Some((e, _)) => {
                eprintln!(
                    concat!(
                        "Error[ksl::builtin::pend]: ",
                        "Expected a list, but got `{:?}`."
                    ),
                    e
                );
                None
            }
            None => {
                eprintln!(
                    concat!(
                        "Error[ksl::builtin::pend]: ",
                        "Cannot evaluate expression {:?}."
                    ),
                    lst
                );
                None
            }
        }
    } else {
        eprintln!(
            concat!(
                "Error[ksl::builtin::pend]: ",
                "Only accepts a list and a value as arguments, but {:?} were passed."
            ),
            args
        );
        None
    }
}