1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//! # ksl::builtin::fun
//!
//! Built-in function `Fun`.
use crate::{Environment, value::Value};
pub(crate) fn builtin(args: &[Value], env: Environment) -> Result<Value, std::sync::Arc<str>> {
if let [params_val, func_body] = args {
let params = match params_val {
Value::List(symbols) => {
let mut symbol_list = Vec::with_capacity(symbols.len());
for param in symbols.iter() {
match param {
Value::Symbol(sym) => {
symbol_list.push(sym.clone());
}
e => {
return Err(std::sync::Arc::from(format!(
concat!(
"Error[ksl::builtin::Fun]: ",
"Expected a symbol, but got: `{}`."
),
e
)));
}
}
}
symbol_list
}
e => {
return Err(std::sync::Arc::from(format!(
concat!(
"Error[ksl::builtin::Fun]: ",
"Expected a list, but got: `{}`."
),
e
)));
}
};
Ok(Value::Lambda(
params,
std::sync::Arc::new(func_body.clone()),
env,
))
} else {
Err(std::sync::Arc::from(format!(
concat!(
"Error[ksl::builtin::Fun]: ",
"Expected 2 parameters, but {} were passed."
),
args.len()
)))
}
}