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
55
56
57
58
59
60
61
62
63
64
65
66
67
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
}
}