ksl 0.1.7

KSL core library and interpreter
Documentation
//! # ksl::builtin::pend
//!
//! Built-in function `Append` and `Prepend`.

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::{:?}]: ",
                                "Cannot evaluate expression {:?}."
                            ),
                            if is_prepend { "prepend" } else { "append" },
                            new_element
                        );
                        None
                    }
                }
            }
            Some((e, _)) => {
                eprintln!(
                    concat!(
                        "Error[ksl::builtin::{:?}]: ",
                        "Expected a list, but got `{:?}`."
                    ),
                    if is_prepend { "prepend" } else { "append" },
                    e
                );
                None
            }
            None => {
                eprintln!(
                    concat!(
                        "Error[ksl::builtin::{:?}]: ",
                        "Cannot evaluate expression {:?}."
                    ),
                    if is_prepend { "prepend" } else { "append" },
                    lst
                );
                None
            }
        }
    } else {
        eprintln!(
            concat!(
                "Error[ksl::builtin::{:?}]: ",
                "Only accepts a list and a value as arguments, but {:?} were passed."
            ),
            if is_prepend { "prepend" } else { "append" },
            args
        );
        None
    }
}