ksl 0.1.7

KSL core library and interpreter
Documentation
//! # ksl::builtin::fun
//!
//! Built-in function `Fun`.

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
    }
}