rl_lang/interpreter/stdlib/rl/
eval.rs1use crate::interpreter::{
2 evaluator::Evaluator,
3 stdlib::common::{extract_string, verr, vok, vs},
4 values::Value,
5};
6use crate::lexer::tokenizer::Tokenizer;
7use crate::parser::parser_logic::Parser;
8use crate::utils::source::SourceFile;
9
10pub fn func(eval: &mut Evaluator, value: Value) -> Value {
11 let code = match extract_string(value, "eval") {
12 Ok(s) => s,
13 Err(e) => return verr!(vs!(e)),
14 };
15
16 let source = SourceFile::new("<eval>", code);
17
18 let tokens = match Tokenizer::lex(source.clone()) {
19 Ok(t) => t,
20 Err(e) => return verr!(vs!(e.message().to_string())),
21 };
22
23 let (ast, statements) = match Parser::parse(tokens, source) {
24 Ok(s) => s,
25 Err(e) => return verr!(vs!(e.message().to_string())),
26 };
27
28 let statements = eval.resolver.ast_arena.merge_statements(ast, statements);
29
30 let mut resolver = std::mem::take(&mut eval.resolver);
31 resolver.push_scope();
32 let resolved = resolver.resolve_statements(statements);
33 resolver.pop_scope();
34 eval.resolver = resolver;
35
36 let prev_buffer = eval.output_buffer.take();
37 eval.output_buffer = Some(String::new());
38 eval.environment.push(vec![]);
39
40 let result = eval.evaluate_block(&resolved);
41
42 eval.environment.pop();
43 let captured = eval.output_buffer.take().unwrap_or_default();
44 eval.output_buffer = prev_buffer;
45
46 match result {
47 Ok(_) => vok!(vs!(captured)),
48 Err(e) => verr!(vs!(e.message().to_string())),
49 }
50}