Skip to main content

rl_lang/interpreter/stdlib/rl/
eval.rs

1use 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}