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
68
69
70
71
//! # 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
}
}