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
72
73
74
75
76
77
78
use rust_dynamic::value::Value;
use rust_dynamic::types::*;
use crate::multistackvm::*;
use easy_error::{bail, Error};
impl VM {
pub fn apply_in(&mut self, name: String, value: Value) -> Result<&mut VM, Error> {
match value.dt {
CALL => {
match value.cast_string() {
Ok(fun_name) => {
if self.is_command(fun_name.clone()) {
return self.c(fun_name.clone());
} else {
if self.autoadd {
self.stack.push_to_stack(name.clone(), value);
} else {
let real_name = match self.get_alias(fun_name.clone()) {
Ok(real_name) => real_name,
Err(_) => fun_name.clone(),
};
if self.is_lambda(real_name.clone()) {
match self.get_lambda(real_name.clone()) {
Ok(lambda) => {
return self.lambda_eval_in(name.clone(), lambda);
}
Err(err) => {
bail!("Error getting lambda {}: {}", &fun_name, err);
}
}
} else {
return self.i(real_name.clone());
}
}
}
}
Err(err) => {
bail!("Can not get the name of function the CALL value: {}", err);
}
}
}
CONTEXT => {
match value.cast_string() {
Ok(ctx_name) => {
if self.autoadd {
self.stack.push_to_stack(name.clone(), value);
} else {
match self.to_stack(ctx_name) {
Ok(_) => {}
Err(err) => {
bail!("Switching to a stack returns error: {}", err);
}
}
}
}
Err(err) => {
bail!("Can not get the name of context from the CONTEXT value: {}", err);
}
}
}
_ => {
if self.autoadd {
match self.stack.pull_from_stack(name.clone()) {
Some(mut val) => {
self.stack.push_to_stack(name.clone(), val.push(value));
}
None => {
bail!("Autoadd found no working data on stack");
}
}
} else {
self.stack.push_to_stack(name.clone(), value);
}
}
}
Ok(self)
}
}