Skip to main content

ksl/builtin/
head.rs

1//! # ksl::builtin::head
2//!
3//! Built-in function `Head`.
4
5use crate::{Environment, eval::apply::eval_apply, value::Value};
6
7pub(crate) fn builtin(args: &[Value], env: Environment) -> Result<Value, std::sync::Arc<str>> {
8    if let [lst] = args {
9        match eval_apply(lst, env)? {
10            Value::List(elements) => {
11                if elements.is_empty() {
12                    Err(std::sync::Arc::from(concat!(
13                        "Error[ksl::builtin::Head]: ",
14                        "Empty list."
15                    )))
16                } else {
17                    Ok(elements[0].clone())
18                }
19            }
20            e => Err(std::sync::Arc::from(format!(
21                concat!("Error[ksl::builtin::Head]: ", "Unexpected value: `{}`."),
22                e
23            ))),
24        }
25    } else {
26        Err(std::sync::Arc::from(format!(
27            concat!(
28                "Error[ksl::builtin::Head]: ",
29                "Expected 1 parameter, but {} were passed."
30            ),
31            args.len()
32        )))
33    }
34}