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
use rust_dynamic::types::*;
use crate::bundcore::*;
use bund_language_parser::bund_parse;
use easy_error::{Error, bail};
impl Bund {
pub fn eval<N: AsRef<str> + ToString>(&mut self, value: N) -> Result<&mut Bund, Error> {
let source = format!("{}\n", value.to_string());
match bund_parse(&source) {
Ok(words) => {
for word in words {
match word.dt {
NONE => {
continue;
}
EXIT => {
break;
}
ERROR => {
match word.cast_error() {
Ok(error) => {
bail!("Detected an Error posted on the stack: {:?}", error);
}
Err(err) => {
bail!("Detected an Error posted on the stack, but extraction of error is failed: {}", err);
}
}
}
_ => {
match self.vm.apply(word.clone()) {
Ok(_) => {}
Err(err) => {
bail!("Attempt to evaluate value {:?} returned error: {}", &word, err);
}
}
}
}
}
}
Err(err) => {
bail!("{}", err);
}
}
Ok(self)
}
}